我需要一些帮助来理解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格式不匹配。
所以,问题是:
更新
进一步阅读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,但它也不多语言。我不知道在哪里可以找到有关多语言部分的其他信息 - 例如,每种语言使用的确切格式。
答案 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 datetime2
和date
中的新数据类型不依赖于SET LANGUAGE
或SET 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)
这将给出预期的结果。