在SQL Server中将字符串值转换为Datetime会引发异常

时间:2017-08-03 09:40:00

标签: sql-server

我努力将nvarchar转换为日期时间。

我目前有查询:

SELECT  
    ACCT_NBR, BANK_CODE, ACCT_CODE, ACCT_CCY, HOLDER_CODE, 
    ACCT_GRP_CODE, RECEPTION_TIMES
FROM 
    VIEW_ID_MONITORING
WHERE 
    STATUS = 'EXPECTING' 
    AND ACCT_GRP_CODE = 'ID_ACME_SHIPPING_EUROPE' 
    AND CONVERT(VARCHAR(24), '2017-08-03T11:00:00+02:00', 127) = RECEPTION_START 

我想检查RECEPTION_START是否与今天相同,11'时钟偏移为2小时。

但运行此查询会抛出异常

  

com.microsoft.sqlserver.jdbc.SQLServerException:转换失败   从字符串转换日期和/或时间时。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

首先,正如Peter所评论的那样,您正在将varchar转换为varchar 其次,这种价值无法转换为DateTime,但可以转换为DateTimeOffset

SELECT CONVERT(DATETIMEOFFSET, '2017-08-03T11:00:00+02:00', 127)

返回03.08.2017 11:00:00 +02:00

答案 1 :(得分:3)

所以你的错误条件不是将datetime转换为varchar的问题,而是将varchar转换为datetime。

RECEPTION_START是日期时间值吗?如果是,则datetime的优先级高于varchar,这意味着sql-server实际上正在尝试执行以下操作。

CONVERT(DATETIME,CONVERT(VARCHAR(24), '2017-08-03T11:00:00+02:00', 127)) = RECEPTION_START

这是一个问题,因为你的输入字符串是25长,而varchar(24)正在减少一个零,因为你不能将时区信息转换为日期时间(只有datetime2或datetimeoffset)< / p>

请尝试以下解决方案:

CONVERT(datetimeoffset,'2017-08-03T11:00:00+02:00') = RECEPTION_START

此外,您还需要检查RECEPTION_START是datetime,datetime2还是datetimeoffset。除非是datetimeoffset,否则您需要将某些内容与时区设置值进行比较。确保你想要的是什么。如果您转换为2017-08-03T11:00:00 + 02:00&#39;到datetime2,+2:00被截断。

确认从日期字符串转换为varchar没有问题。

select CONVERT(VARCHAR(24), '2017-08-03T11:00:00+02:00', 127)

对我来说都适用于2012年和2014年。只有当你输入字符串实际为25长时才设置varchar 24类型。但是,如果你使用解决方案,这不重要。

答案 2 :(得分:0)

你可以使用 '2017-08-03T11:00:00+02:00Z'因为模式127需要这种格式:

yyyy-mm-ddThh:mi:ss.mmmZ

或使用126代替127,因为这需要:

yyyy-mm-ddThh:mi:ss.mmm