一尘不染

为什么SQL Server会误解此ISO 8601格式日期?

sql

为什么SQL Server(2005)会误解此ISO 8601格式日期?(YYYY-MM-DD)

DECLARE @FromDate DATETIME
SET @FromDate = '2013-01-05'
PRINT @FromDate
-- Prints: May  1 2013 12:00AM

文本格式的日期显然是1月5日,但由于某种原因,SQL Server会将其解释为5月1日。世界上没有YYYY-DD-
MM的日期格式,为什么会发生这种情况?我已经使用这种格式多年了,以前从未遇到过问题,因此我不确定在这种情况下有什么不同。

即使我使用CONVERT强制将其导入ISO8601,它仍然会出错:

DECLARE @FromDate DATETIME
SET @FromDate = CONVERT(VARCHAR, '2013-01-05', 126) 
PRINT @FromDate
-- Still prints: May  1 2013 12:00AM

编辑:糟糕-
我使用的是’CONVERT(VARCHAR,上面我的意思是CONVERT(DATETIME),所以这就是为什么没有生效的原因。谢谢@RBarryYoung

但是,如果我在不同的服务器(SQL 2012)上运行上述两个示例中的任何一个,它们都将正确打印’Jan 5 2013 12:00 AM’

这里发生了什么事?我认为将SQL格式与SQL Server一起使用的主要原因之一是它使月份和日期变得毫不含糊?


阅读 151

收藏
2021-03-10

共1个答案

一尘不染

它仅对于较新的数据类型(date/ datetime2)而言是明确的

为了向后兼容,它仍然依赖于dateformat datetime

在SQL Server 2012上

SET DATEFORMAT DMY

SELECT CAST('2013-01-05' AS DATETIME),   /*May*/
       CAST('2013-01-05' AS DATETIME2),  /*Jan*/
       CAST('20130105' AS DATETIME),     /*Jan*/
       CAST('20130105' AS DATETIME2)     /*Jan*/

yyyymmdd在处理这些数据类型时,可以将其用作明确的格式。

请参阅日期时间数据类型的最终指南unseparated在该文章中称为格式)

2021-03-10