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

Update SQL and converting nvarchar string to dateTime

我将数据从 CSV 插入 SQL 服务器。

tableTbl_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

我要更新另一个 table Tbl_art, table:

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
Conversion failed when converting date and/or time from character string.

感谢您的帮助

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

顺便说一句:columnName "importedDate" 后面真的有一个 space 吗?

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

你可能会读到这个

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

因为Marc_s已经回答here

SQL 服务器支持多种格式 - 请参阅 MSDN Books Online on CAST and CONVERT。大多数这些格式依赖于您的设置 - 因此,这些设置有时可能有效 - 有时无效。

解决这个问题的方法是使用 SQL 服务器支持的(稍微改编的)ISO-8601 日期格式 - 这种格式有效 总是 - 无论您的 SQL 服务器语言和日期格式设置如何。

ISO-8601 format 受 SQL 支持 服务器有两种形式:

  • YYYYMMDD 仅用于日期(无时间部分);此处注意:没有破折号!,这一点非常重要! YYYY-MM-DD NOT 独立于 SQL 服务器中的日期格式设置,并且 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 服务器 2008 或更新版本,您也可以使用 DATETIME2 数据类型(而不是普通的 DATETIME)和您当前的 INSERT 可以毫无问题地工作! :-) DATETIME2 好多了,对转换的挑剔也少了很多 - 无论如何,它是 SQL Server 2008 或更新版本的推荐 date/time 数据类型。

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 服务器以及 SQL 服务器中的任何语言和日期格式设置都应该没问题。

我好像是csv文件出错了... 它在日期后包含一个 space 我使用 SSIS 包来安排导入,他毫无问题地处理了转换 谢谢