为什么SQL Server使用无效样式将VARCHAR转换为DATETIME?

Ber*_*ann 9 sql t-sql sql-server

我无法从文档中看出为什么SQL Server以非指定样式的格式解析文本.

无论我是否以预期的格式提供文本:

SELECT CONVERT(DATETIME, N'20150601', 112)
Run Code Online (Sandbox Code Playgroud)

或格式不正确(格式113):

SELECT CONVERT(DATETIME, N'20150601', 113)
Run Code Online (Sandbox Code Playgroud)

结果是一样的:2015-06-01 00:00:00.000我希望后者无法正确转换日期.

它采用什么规则,试图将转换时VARCHARDATETIME?即为什么后者(格式样式不正确)仍能正确解析日期?

编辑:我似乎还不够清楚.风格113应该是期望的,dd mon yyyy hh:mi:ss:mmm(24h)yyyymmdd由于某种原因它很乐意转换格式的值.

Joh*_*ell 6

因为日期是规范格式,即(20150101).数据库引擎隐式地落后于它.这是兼容性功能.

如果您将这些格式换成英国或美国日期格式,您将收到转换错误,因为它们无法隐式转换.

编辑:您实际上可以告诉它将其转换为猪,它仍然会隐式地将其转换为日期时间:

select convert(datetime,'20150425',99999999)
select convert(datetime,'20150425',100)
select convert(datetime,'20150425',113)
select convert(datetime,'20150425',010)
select convert(datetime,'20150425',8008135)
select convert(datetime,'20150425',000)
Run Code Online (Sandbox Code Playgroud)

并证明这是兼容性功能:

select convert(datetime2,'20150425',99999999)
Run Code Online (Sandbox Code Playgroud)

虽然您仍然可以隐式转换datetime2对象,但样式必须在转换图表的范围内.