2017-05-24 247 views
0

我有2008此查詢的SQL Server:日期格式問題2008

SELECT DATEADD(mm, -2, '2017-05-10'); 

我有我的代碼運行今天評論說,結果看起來像「2017年8月5日」而不是「2017年預計-03-10'。在轉換之前,日期格式似乎變成了yyyy-dd-mm,並返回到yyyy-mm-dd以顯示結果。

有什麼解釋嗎?如何解決這個問題?

+3

嘗試使用*修改* ** ISO-8601中性語言格式的表格中**日期的格式只能是字符串文字:'SELECT DATEADD(mm,-2,'20171005');'(格式是'YYYYMMDD' - 沒有破折號,沒有空格)。這對於所有**語言和區域設置都可靠地工作,適用於任何版本的SQL Server –

+0

'SELECT DATEADD(mm,-2,CAST('2017-05-10'as datetime))'會先投射日期時間,然後減去兩個月。如果你可以格式化你的數據,@marc_s有一個很好的答案,否則你必須首先做一些CAST或CONVERT。 –

+0

謝謝,@marc_s。我在SQL Server 2012上進行了第一次測試,'DATEADD(mm,-2,'2017-05-10')'返回了'2017-03-10',這是我的預期。版本問題。 – sk001

回答

0

你在談論的是不是一個日期格式問題,但日期時間問題,其實,如果你試試這個代碼,你將總是得到相同的結果:當使用日期時間

set dateformat ymd 
SELECT DATEADD(mm, -2, cast('2017-05-10' as date)); 

set dateformat ydm 
SELECT DATEADD(mm, -2, cast('2017-05-10' as date)); 

你會得到不同的結果,這取決於你的語言/ dateformat設置:

set language us_english 
SELECT DATEADD(mm, -2, '2017-05-10'); 

set language russian 
SELECT DATEADD(mm, -2, '2017-05-10'); 

格式爲YYYY-MM-DD與日期類型使用時是語言中性的,但它與日期時間使用時是依賴於語言的。

說明:

需要注意的是最新的一些字符串格式和 時間文字和語言相關,這意味着重要的是,當你將它們轉換 的日期和時間數據類型,SQL服務器可能會根據在 會話中生效的語言設置不同來解釋 值。數據庫管理員定義的每個登錄都有一個與之關聯的默認語言 ,除非明確將其更改爲 ,否則該語言將成爲 會話中的有效語言。您可以使用SET LANGUAGE命令將會話中的默認語言覆蓋 ,但這通常不會修改,因爲代碼的某些方面可能依賴於用戶的默認語言 。會話中的有效語言在幕後設置了幾個 語言相關的設置,其中一個名爲 DATEFORMAT,它確定SQL Server如何解釋您在從字符串類型轉換爲 日期時輸入的文件 和時間類型。 DATEFORMAT設置表示爲字符d,m和y的組合 。例如, us_english語言設置將DATEFORMAT設置爲mdy,而 英國語言設置將DATEFORMAT設置爲dmy。您可以使用SET DATEFORMAT 命令覆蓋會話中DATEFORMAT設置的 設置,但如前所述,通常不推薦更改與語言相關的設置 。例如,考慮文字 '02/12/2007'。 SQL Server可以將日期解釋爲二月 12,2007或2007年12月2日,當您將此文字轉換爲 以下類型之一:DATETIME,DATE,DATETIME2或DATETIMEOFFSET。 有效的LANGUAGE/DATEFORMAT設置是決定性因素。 要演示相同字符串 文字的不同解釋,請運行以下代碼。 SET LANGUAGE英國; SELECT CAST('02/12/2007'AS DATETIME); SET LANGUAGE us_english; SELECT CAST('02/12/2007'AS DATETIME);

相關文章:Working with Date and Time Data by Itzik Ben-Gan

下面的鏈接,你會發現與不同的日期/時間類型

-2

試試這個:SELECT DATEADD(毫米,-2, '2017年10月5日')=> 2017年3月10日