2013-10-24 58 views
1

爲什麼SQL Server(2005)會誤解此ISO 8601格式日期? (YYYY-MM-DD)爲什麼SQL Server誤解了這個ISO 8601格式的日期?

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

文本格式的日期,顯然是月5日,但由於某種原因,SQL服務器將其解釋爲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格式的主要原因之一是它使月份和日期明確無誤?

+3

實際上,'YYYY-DD-MM'是法語的區域設置日期的格式(見本[連接](HTTP://連接.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID = 290971)嘗試讓它折舊的頁面!)爲您的文字嘗試'YYYYMMDD'格式 - 我徹底推薦[本文](http://sqlblog.com/博客/ aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx)由MVP Aaron Bertrand撰寫。 – Bridge

+0

謝謝@Bridge - 這是非常有用的(但我的服務器不是法語,所以我仍然感到困惑!) – NickG

+0

如果在SQL字符串中指定日期,我總是使用''2013年1月5日'格式 - 它會解析這絕對不是含糊不清的。 – Charleh

回答

2

它僅使得它明確爲較新的數據類型(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格式)

+0

但這篇文章同意我的意思,並沒有解釋我的問題。特別是它說:「只要年份第一,這些新類型對於分隔的日期時間字面值就是語言中立的,SQL Server需要確定這是年份,所以它需要4個數字年(yyyy,而不是yy)。如果是這樣的話,那麼字符串將被解釋爲第一年,然後是第二個月,最後一天 - 無論DATEFORMAT或語言設置如何。「 – NickG

+0

@NickG - 請閱讀該報價的前三個字詞,但您沒有使用新的 –

+0

好的,我可以看到你對非分離格式的含義,但是我仍然不明白爲什麼即使當我使用convert轉換到ISO 8601時,它仍然會出錯,ISO 8601使用了連字符 – NickG