为什么SQL Server的日期格式会影响带时间戳的日期转换

时间:2017-12-14 16:28:40

标签: sql-server datetime casting

我尝试使用以下脚本将包含日期的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服务器中发生的事情

2 个答案:

答案 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

*/