为什么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一起使用的主要原因之一是它使月份和日期变得毫不含糊?
它仅对于较新的数据类型(date/ datetime2)而言是明确的
date
datetime2
为了向后兼容,它仍然依赖于dateformat datetime。
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在处理这些数据类型时,可以将其用作明确的格式。
yyyymmdd
请参阅日期时间数据类型的最终指南(unseparated在该文章中称为格式)
unseparated