为什么SQL Server误解了这个ISO 8601格式的日期?

时间:2013-10-24 11:58:57

标签: sql sql-server tsql datetime

为什么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),它们都会正确打印'2013年1月5日12:00 AM'

这里发生了什么?我认为在SQL Server中使用ISO格式的一个主要原因是它使月份和日期明确无误?

1 个答案:

答案 0 :(得分:4)

它只对新的数据类型(date / datetime2)明确无误

为了向后兼容,这仍然依赖于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作为明确的格式。

请参阅The ultimate guide to the datetime datatypes(该文章中称为unseparated格式)