Sql 为什么采用ISO 8601日期格式';yyyy-mm-dd';字符串文字即使在用户';s登录设置为';mdy';

Sql 为什么采用ISO 8601日期格式';yyyy-mm-dd';字符串文字即使在用户';s登录设置为';mdy';,sql,sql-server,tsql,date,datetime,Sql,Sql Server,Tsql,Date,Datetime,我运行以下查询: dbcc useroptions declare @mydate as datetime set @mydate = '29-07-2017' --here the format is dmy so SQL Server fails to parse it select @mydate 它告诉我的dateformat设置是mdy 然后,我在SQL Server Management Studio(SSMS)中运行以下查询,该查询已成功运行: declare @mydat

我运行以下查询:

dbcc useroptions
declare @mydate as datetime

set @mydate = '29-07-2017' --here the format is dmy so SQL Server fails to parse it

select @mydate
它告诉我的
dateformat
设置是
mdy

然后,我在SQL Server Management Studio(SSMS)中运行以下查询,该查询已成功运行:

declare @mydate as datetime

set @mydate = '07-29-2017' -- 'mdy' formatted date string corresponding to 29 August, 2017

select @mydate
现在,我运行以下查询:

dbcc useroptions
declare @mydate as datetime

set @mydate = '29-07-2017' --here the format is dmy so SQL Server fails to parse it

select @mydate
上述查询导致以下错误:

Msg 242,16级,状态3,第5行varchar数据的转换 类型转换为日期时间数据类型导致值超出范围

我可以接受这个错误,因为日期格式不匹配。但是,当我运行下面的查询时,它会成功:

declare @mydate as datetime

set @mydate = '2017-07-29' -- this ymd format is also conflicting with mdy setting but it succeeds

select @mydate

因此,我想了解SQL Server解析任何字符串日期时间的能力是否完全取决于
useroptions
中的
dateformat
设置?如果是,那么为什么ISO 8601日期格式
yyyy-MM-dd
字符串日期被成功解析?如果否,那么此成功解析的驱动设置/原因是什么?

这将在SQL Server中始终有效:

set @mydate = '20170729'
不管国际化设置如何(如上所述)。这并不能完全回答您的问题,但它指出,
dateformat
并非包罗万象

我怀疑带有连字符的版本是出于利他主义(SQL Server确定年份是第一年)或者因为它与ODBC格式非常相似而被接受的。

最终获得了一份引文,为我的问题澄清了问题

通常,字符串文字的日期时间格式实际上由SQL会话的用户登录的日期格式和语言设置控制:

字符串文字格式影响应用程序中数据的表示 对于用户,而不是SQL Server中的基础整数存储格式。 但是,SQL Server可能会以字符串文字解释日期值 格式,由应用程序或用户输入,用于存储或保存日期 函数,作为不同的日期。解释取决于具体情况 字符串文字格式、数据类型和运行时集的组合 DATEFORMAT,设置语言和默认语言选项设置

但ISO 8601独立于用户的默认语言设置:

某些字符串文字格式不受这些设置的影响。 考虑使用不依赖于这些设置的格式,除非 您知道该格式的设置是正确的。ISO8601格式 不依赖于这些设置,是国际标准。 使用字符串文字格式的Transact-SQL,具体取决于系统 设置,不太便于携带

还有一种特殊情况是日期字符串文字,它独立于用户登录的SQL会话的dateformat设置-
不带分隔符的字符串文字
。此类日期不属于任何本地或国际格式,但始终假定为
ymd
格式。引用链接:

可以将日期数据指定为未分离的字符串。日期数据可以 通过使用四位、六位或八位数字、空字符串或 没有日期值的时间值。设置日期格式会话设置 不适用于所有数字日期条目,例如数字条目 没有分离器。六位或八位字符串始终为 解释为ymd。月份和日期必须始终为两位数


使用ISO 8601格式的优点是它是一个国际标准
,并且
此格式不受设置日期格式或设置语言设置的影响
感谢您的回复。我从不担心连字符。我知道SQL Server也能够在不使用分隔符的情况下解析日期时间。我终于能够在MSDN文档中获得与我面临的问题相对应的准确引用。我已经为同样的问题添加了一个答案+1.那真的很好。我唯一的问题是ISO 8601允许在表示中使用连字符,但SQL Server并不总是这样做。(只需看上的示例)您的观察是正确的,但根据SQL Server,任何不带分隔符的日期都不属于ISO 8601格式。他们再次受到特殊和不同的待遇。它们被硬编码假定为
ymd
格式。我现在也在我的帖子中引用了这一引文。处理方法相同,但不假定为ISO 8601格式。