Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中转换数据_Sql_Sql Server_Bulkinsert - Fatal编程技术网

在SQL Server中转换数据

在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-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在评论中说:


我正在处理的数据是 客户的出生日期。既然我这么做了 不想在网上发布某人的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来掩盖日期和年份,但我保留了月份,因为这是问题的根源。