更新SQL并将nvarchar字符串转换为dateTime

时间:2016-04-15 08:21:24

标签: sql-server csv datetime nvarchar import-from-csv

我将CSV中的数据插入SQL Server。

Tbl_art_tmp是:

Art nchvar(50)  
Qty nvarchar(50)
importedDate nvarchar(50)

要插入的SQL查询

BULK INSERT Tbl_Art_tmp 
FROM 'ExportArt.CSV' 
WITH 
    (FIRSTROW = 1,  
     FIELDTERMINATOR = ';', 
     ROWTERMINATOR='0x0a');

从其他软件导出的csv包含

Art;Qty;importedDate
10203R04-04; 0;2015-10-21
10407T-10-100; 9;2016-02-01

我想更新另一个表Tbl_art,表格:

art nvarchar(30)
Qty real
lastUpdate datetime

我的SQL查询:

UPDATE a
SET a.[qty] = CAST(atemp.[Qty] AS REAL),
    a.[lastUpdate] = CAST(atemp.[importedDate] AS DATETIME)
FROM [Tbl_Art] a
JOIN [Tbl_art_tmp] atemp ON a.[art] = atemp.[Art];

数量更新可以,而不是日期时间转换

  

Msg 241,Level 16,State 1,Line 3
  从字符串转换日期和/或时间时转换失败。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

尝试使用CONVERT(DATETIME,atemp.[importedDate ],102)

btw:columnName“importedDate”后面是否真的有空格?

您遇到的问题可能与文化/语言有关。

您可能会阅读此https://stackoverflow.com/a/34275965/5089204

Convert允许您指定专用格式。 cast只会尝试使用您的默认值

答案 1 :(得分:0)

由于 Marc_s 已经回答here

SQL Server支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。大多数格式都是依赖你所拥有的设置 - 因此,这些设置可能会有效 - 有时也不会。

解决此问题的方法是使用SQL Server支持的(略微调整的) ISO-8601日期格式 - 此格式始终 - 无论您的是什么SQL Server语言和日期格式设置。

SQL Server支持ISO-8601 format有两种形式:

  • YYYYMMDD仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD 独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!

或:

  • YYYY-MM-DDTHH:MM:SS了解日期和时间 - 请注意:此格式破折号(但可以可以省略),还有一个固定的T作为DATETIME的日期和时间部分之间的分隔符。

这适用于SQL Server 2000及更高版本。

所以在你的具体案例中 - 使用这些字符串:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

你应该没事(注意:你需要使用国际 24小时格式而不是12小时AM / PM格式)。

或者:如果您使用的是SQL Server 2008 或更新版本,您还可以使用DATETIME2数据类型(而不是普通DATETIME )和你当前的INSERT只会毫无问题地工作! :-) DATETIME2要好得多,转换时也不那么挑剔 - 而且无论如何它都是SQL Server 2008或更新版本的推荐日期/时间数据类型。

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

不要问我为什么这整个话题如此棘手而且有点令人困惑 - 这就是它的方式。但是使用YYYYMMDD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。

答案 2 :(得分:0)

我似乎是csv文件的错误... 它在日期之后包含一个空格 我使用SSIS包来安排导入,他没有任何问题地处理转换 谢谢