我尝试使用以下脚本将包含日期的varchar转换为SQL Server中的datetime字段
SELECT cast('2017-12-14 14:30:41.007' as datetime)
当我在使用DateFormat myd的本地计算机上运行此程序时,此工作正常并返回了有效的日期时间。 当我在使用Dateformat dym的服务器上运行此语句时,服务器返回以下错误
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
为什么' 2017-12-14 14:30:41.007' " myd"下的有效日期时间但不是在" dym"即使它既不是" dym"也不是" myd"日期?
我找到了解决这个问题的工作,我问,因为我想了解SQL服务器中发生的事情
答案 0 :(得分:0)
'2017-12-14 14:30:41.007'
似乎遵循ODBC规范,时间,日期,日期时间和日期时间偏移的毫秒默认标准。如果您使用的是MS SQL,则可以使用CONVERT来处理字符串参数的特定样式:
SELECT convert(datetime,'2017-12-14 14:30:41.007' , 121 )
答案 1 :(得分:0)
这是因为SQL服务器将14解释为月份数,而且只有12个月。如果您将14更改为11并运行此脚本,您将看到差异:
SET DATEFORMAT myd
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime))
SET DATEFORMAT dym
SELECT DATEPART(month,cast('2017-12-11 14:30:41.007' as datetime))
/*
Output:
12
11
*/
为了使所有时间格式的一致,将T放在日期和时间的中间。这使得SQL服务器认为日期是ISO8601格式。
SET DATEFORMAT myd
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime))
SET DATEFORMAT dym
SELECT DATEPART(month,cast('2017-12-11T14:30:41.007' as datetime))
/*
Output:
12
12
*/