我可以帮助你理解SQL Server中的日期格式处理。如果您尝试以下操作,它将返回正确的结果:
我知道可以使用语言无关的(稍作修改的ISO-8601)格式
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
(无破折号),它可以在任何语言中使用。然而,我不明白为什么YYYY-MM-DD
是与语言相关的,当SQL书籍明确说明:“解释取决于字符串文字格式的组合和默认语言选项设置……某些字符串文字格式不受这些设置影响……ISO 8601格式不依赖于这些设置,是国际标准。”
http://technet.microsoft.com/en-us/library/ms180878%28v=sql.105%29.aspx
即使查看select * from sys.syslanguages
返回的日期格式也没有任何指示——日期格式是dmy
,因此它也不符合ISO-8601格式。所以问题是:为什么ISO-8601格式与语言有关,尽管Books Online说不是?在哪里可以找到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,但也不是多语言的。我不确定在哪里可以找到关于多语言部分的更多信息 - 比如每种语言使用的确切格式。
SET LANGUAGE German; SELECT CAST('15.08.2013' AS DATETIME)
。只使用convert呢? - Brett Schneiderdateformat
column insys.syslanguages
. - Mikael Eriksson