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

mat*_*atk 10 sql sql-server datetime iso date

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

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

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

-- 2013-08-15 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

但是,这会导致转换错误,因为显然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.
Run Code Online (Sandbox Code Playgroud)

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

但是YYYY-MM-DD,当SQL Books清楚地说,我不明白为什么语言依赖

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

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

即使查看返回的dateformat select * from sys.syslanguages也没有任何指示 - 日期格式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,但它也是不是多语言.我不知道在哪里可以找到有关多语言部分的其他信息 - 例如,每种语言使用的确切格式.

Mik*_*son 1

我的猜测是保持向后兼容性。SQL Server 2008 中的新数据类型datetime2并不date依赖于SET LANGUAGESET DATEFORMAT。这是一个连接项datetime,建议也更改其行为。