在SQL Server中转换数据
我正在加载一组数据,其中包含如下格式的日期: 00-1-0000在SQL Server中转换数据,sql,sql-server,bulkinsert,Sql,Sql Server,Bulkinsert,我正在加载一组数据,其中包含如下格式的日期: 00-1-0000 00-FEB-0000 00-3-0000 00-APR-0000 00-5-0000 00-JUN-0000 00-JUL-0000 00-8-0000 00-SEP-0000 00-10-0000 0000年11月00日 oo-DEC-0000 SQL无法自动转换这些日期,因为它无法识别日期的月份部分。我有大约50000张唱片要导入。有什么想法吗 OP在评论中说: 我正在处理的数据是 客户的出生日期。既然我这么做了 不想在网上
00-FEB-0000
00-3-0000
00-APR-0000
00-5-0000
00-JUN-0000
00-JUL-0000
00-8-0000
00-SEP-0000
00-10-0000
0000年11月00日
oo-DEC-0000 SQL无法自动转换这些日期,因为它无法识别日期的月份部分。我有大约50000张唱片要导入。有什么想法吗 OP在评论中说:
我正在处理的数据是 客户的出生日期。既然我这么做了 不想在网上发布某人的DOB, 我用0来掩饰这一天和这一年 但我把这个月原封不动地留下了 导致问题的原因。
SQL可以识别日期的月份部分,但不能识别日期(零)或年份(也为零)。如果必须使用大容量插入,请尝试以下操作:
- 将数据加载到临时表中,列设置为char(11)
- 将数据复制(插入…选择…)到目标表
INSERT MyTable (MyDate)
select '01' + substring(@foo, 4, 3) + cast(year(getdate()) as char(4))
from MyInterimTable
(这会将其设置为当前年份的第一天。)创建一个暂存表,其中有一个要由数据填充的
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
输出:
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)
你是怎么进口的
你确定其中一个日期没有一点不确定吗?SQL server应接受您的(实际非零)日期dd mmm yyyy格式
select convert(datetime, '12-NOV-1975')
1975-11-12 00:00:00.000
我想我发现了这个问题。当我查看发送的数据时,我看到在某些记录中,前一个字段是空的。当我把日期分开时,我只得到年份的最后两位数。这就是我的错误所在。感谢大家的帮助。这些日期无效,因为没有日期
0
。你认为导入日期后的外观如何?你可能应该提供更多信息。什么样的sql server,什么样的操作系统。您有哪些可用的工具-sed、awk等?我想他只是用0作为占位符来显示日期,以演示格式,而不是实际数据。@OrbMan-我意识到我发布的数据是无效的日期,因为没有日期0。我只是举个例子。重要的是,月份的格式如上所示。我更愿意将日期保留在dd-mm-yyyy中format@txwikinger-这将部署在SQL 2000 server上。至于其他服务器配置,我不知道,因为我无法直接访问服务器。我处理的数据是客户端的出生日期。由于我不想在网上发布某人的DOB,我用0来掩盖日期和年份,但我保留了月份,因为这是问题的根源。