【问题标题】:Why does SQL server's Date format affect date conversions with Timestamps为什么 SQL Server 日期格式会影响带有时间戳的日期转换
【发布时间】:2017-12-14 16:28:39
【问题描述】:

我正在尝试使用以下脚本将包含日期的 varchar 转换为 SQL Server 中的日期时间字段

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 Server 中发生了什么

【问题讨论】:

标签: sql-server datetime casting


【解决方案1】:

这是因为 SQL Server 将 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 Server 认为日期是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

*/

【讨论】:

    【解决方案2】:

    '2017-12-14 14:30:41.007' 似乎遵循 ODBC 规范,时间、日期、datetime2 和 datetimeoffset 的默认标准为毫秒。如果您使用的是 MS SQL,您可以使用CONVERT 来应对字符串参数的具体样式:

    SELECT convert(datetime,'2017-12-14 14:30:41.007' , 121 )
    

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 2011-12-28
      • 2011-03-05
      • 2019-02-25
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多