SQL Server:为什么ISO-8601格式语言的日期依赖?

时间:2014-01-23 08:13:05

标签: sql sql-server date datetime iso

我需要一些帮助来理解SQL Server中的日期格式处理。

如果您尝试以下操作,它将返回正确的结果:

SET LANGUAGE English
SELECT CAST('2013-08-15' AS DATETIME)

-- 2013-08-15 00:00:00.000

然而,这会导致转换错误,因为显然SQL Server将'8'解释为日,将'15'解释为月份:

SET LANGUAGE German
SELECT CAST('2013-08-15' AS DATETIME)

-- Conversion failed when converting date and/or time from character string.

我知道我可以使用与语言无关(略微适应的ISO-8601)格式YYYYMMDD(没有破折号),它可以使用任何语言。

我不明白,当SQL Books清楚地说

时,为什么YYYY-MM-DD依赖于语言

“解释取决于字符串文字格式,...和默认语言选项设置的组合。...某些字符串文字格式不受这些设置的影响。... ISO 8601格式不会取决于这些设置并且是国际标准。“

http://technet.microsoft.com/en-us/library/ms180878%28v=sql.105%29.aspx

即使查看select * from sys.syslanguages返回的dateformat也没有任何指示 - 日期格式为dmy,因此它也与ISO-8601格式不匹配。

所以,问题是:

  • 为什么ISO-8601格式依赖于语言,即使联机丛书另有说法呢?
  • 在哪里可以找到SQL Server在解析ISO-8601日期时使用的确切格式?

更新

进一步阅读http://technet.microsoft.com/en-us/library/ms180878%28v=sql.105%29.aspx#ISO8601Format,它说'要使用ISO 8601格式,您必须以格式指定每个元素。这包括T,冒号(:),+或 - ,以及句点(。)'(例如2004-05-23T14:25:10)。

上面的表格(http://technet.microsoft.com/en-us/library/ms180878%28v=sql.105%29.aspx#StringLiteralDateandTimeFormats)表示ISO 8601数字依赖于DATEFORMAT,但它也多语言。我不知道在哪里可以找到有关多语言部分的其他信息 - 例如,每种语言使用的确切格式。

3 个答案:

答案 0 :(得分:2)

此相关问题可能有助于语言和ISO-8601日期格式。 Why is SQL Server misinterpreting this ISO 8601 format date?

有关SQL Server使用的日期时间类型的详细信息,请参阅答案中链接的文章The ultimate guide to the datetime datatypes

答案 1 :(得分:1)

我的猜测是保持向后兼容性。 SQL Server 2008 datetime2date中的新数据类型不依赖于SET LANGUAGESET DATEFORMAT。这是一个connect item,它建议也改变datetime的行为。

答案 2 :(得分:0)

很难回答以“为什么”开头的问题: - )

这可能无法解答您的问题,但对于日期,有一种字符串格式适用于所有区域设置:'YYYYMMDD'

尝试:

SET LANGUAGE English
SELECT CAST('20130815' AS DATETIME)

SET LANGUAGE German
SELECT CAST('20130815' AS DATETIME)

SET LANGUAGE Japanese
SELECT CAST('20130815' AS DATETIME)

这将给出预期的结果。