2010-04-13 39 views
1

我加载在一堆包含格式的日期数据如下图所示:转换数据

00-JAN-0000
00-FEB-0000
00-MAR-0000
00 -APR-0000
00-MAY-0000
00-JUN-0000
00-JUL-0000
00-AUG-0000
00-SEP-0000
00-OCT-0000
00-NOV-0000
OO-DEC-0000

SQL不能自动转换这些日期,因为它不承认日期的月份部分。我有大约50,000条记录要导入。有任何想法吗?

OP已经评论说:

我一起工作的数据是出生 客户的日期。由于我做了 不想发布某人的DOB在线, 我掩盖了一天和一年的0s ,但我离开了这个月完好,因为这是 什么是造成这个问题。

+1

那些日期无效,因为没有日期'0'。你是如何期待一旦导入日期? – RedFilter 2010-04-13 14:16:17

+0

你可能应该提供一些更多的信息。什么SQL服务器,什么样的操作系统。你有什么可用的工具 - sed,awk,...? – txwikinger 2010-04-13 14:16:40

+0

我在想他只是以0作为占位符来显示日期来演示格式,而不是实际的数据。 – JohnFx 2010-04-13 14:17:41

回答

0

你怎么导入?

你确定其中的一个日期不是有点有点吗? SQL服务器应接受您的(真实非零)日期dd-mmm-yyyy格式;

select convert(datetime, '12-NOV-1975') 
1975-11-12 00:00:00.000 
0

SQL可以识别的日期的月份部分,但它无法识别你的一天(零)或一年(也为零)。如果你必须使用BULK INSERT,试试这个:

  • 将数据加载到一个临时表中,设置为char(11)
  • 复制列(INSERT ... SELECT ...)的数据到目标表

转换代码将是这样的:(这将它设置为当前年份的第一天)

INSERT MyTable (MyDate) 
select '01' + substring(@foo, 4, 3) + cast(year(getdate()) as char(4)) 
from MyInterimTable 

+0

我正在使用的数据是客户的出生日期。由于我不想在网上发布某人的DOB,所以我用0代替了这一天和那一年,但是我保留了这个月,因为这是导致问题的原因。 – DoubleJ92 2010-04-13 14:29:45

0

创建一个临时表,其中有一个由数据填充的YourDateString列,然后是一个实际的日期时间列YourDate,您将在不同的步骤中更新该列。像这样:

DECLARE @YourTable table(YourDateString varchar(11), YourDate datetime) 

--simulate bulk load 
INSERT INTO @YourTable VALUES ('01-JAN-1976',null) 
INSERT INTO @YourTable VALUES ('02-FEB-1980',null) 
INSERT INTO @YourTable VALUES ('05-MAR-1991',null) 
INSERT INTO @YourTable VALUES ('12-APR-1997',null) 
INSERT INTO @YourTable VALUES ('22-MAY-1990',null) 
INSERT INTO @YourTable VALUES ('18-JUN-1971',null) 
INSERT INTO @YourTable VALUES ('17-JUL-1988',null) 
INSERT INTO @YourTable VALUES ('19-AUG-1993',null) 
INSERT INTO @YourTable VALUES ('19-SEP-1970',null) 
INSERT INTO @YourTable VALUES ('04-OCT-1982',null) 
INSERT INTO @YourTable VALUES ('08-NOV-1970',null) 
INSERT INTO @YourTable VALUES ('18-DEC-1983',null) 

--convert to proper datetime 
UPDATE @YourTable 
    SET YourDate= CONVERT(datetime,YourDateString) 

--show data 
select * from @YourTable 

OUTPUT:

YourDateString YourDate 
-------------- ----------------------- 
01-JAN-1976 1976-01-01 00:00:00.000 
02-FEB-1980 1980-02-02 00:00:00.000 
05-MAR-1991 1991-03-05 00:00:00.000 
12-APR-1997 1997-04-12 00:00:00.000 
22-MAY-1990 1990-05-22 00:00:00.000 
18-JUN-1971 1971-06-18 00:00:00.000 
17-JUL-1988 1988-07-17 00:00:00.000 
19-AUG-1993 1993-08-19 00:00:00.000 
19-SEP-1970 1970-09-19 00:00:00.000 
04-OCT-1982 1982-10-04 00:00:00.000 
08-NOV-1970 1970-11-08 00:00:00.000 
18-DEC-1983 1983-12-18 00:00:00.000 

(12 row(s) affected) 
0

我想我发现了这个问题。当我查看发送的数据时,我发现在某些记录中,前一个字段为空。当我分开日期时,我只能得到一年中的最后两位数字。这是抛出我的错误。感谢大家的帮助。