我努力将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:转换失败 从字符串转换日期和/或时间时。
我做错了什么?
答案 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