了解 SQL Server 中的日期時間格式
我已經處理 MS SQL Server 日期時間類型很長時間了,但從未想過為什麼會發生以下情況:
- 我查詢一個包含 smalldatetime 列的表。此 smalldatetime 始終以格式返回
yyyy-MM-dd hh:mm:ss
- 現在我寫了一個不同的查詢,我想在 WHERE 子句中應用一個 smalldatetime 過濾器,比如
WHERE TimeStamp >= 'yyyy-MM-dd hh:mm:ss'
- SQL Server 檢索到錯誤並告訴我無法將該 nvarchar 轉換為有效的 smalldatetime
看來它只有在我更改指定格式並使用歐洲格式編寫時才有效,例如
WHERE TimeStamp >= 'dd-MM-yyyy hh:mm:ss'
. 為什麼 SQL Server 在應用回自身時以不可覆蓋或無效的格式向我顯示日期?在編寫查詢時更改日期格式沒有任何問題,但我想在應用程序級別(Java-JDBC 應用程序)使用這些日期,並且我不想一直應用日期格式更改。 ..誰能解釋我為什麼會發生這種情況以及是否有任何方法可以在數據庫級別解決它?謝謝!!編輯:請在下面的 Management Studio 中查看錯誤的螢幕截圖。
SQL Server 中唯一真正安全的 DATETIME/SMALLDATETIME 格式是:
yyyyMMdd yyyyMMdd hh:nn:ss[.mmmmmmm] yyyy-MM-ddThh:nn:ss[.mmmmmmm] ----------^ yes, that T is important!
SQL Server、Windows、提供程序、應用程式碼、最終使用者等的任何其他內容都會出現錯誤解釋。例如,以下內容總是會中斷:*
SET LANGUAGE FRENCH; SELECT CONVERT(DATETIME, '2013-11-13');
結果:
語言設置已更改為法語。
消息 242,級別 16,狀態 3,第 2
行將 varchar 數據類型轉換為 datetime 數據類型創建了一個越界值。
只需更改語言(您的任何使用者會話都可以這樣做),SQL Server 就將其解釋為
YYYY-DD-MM
而不是YYYY-MM-DD
. 設置 like 可能會發生類似的事情DATEFORMAT
。但是在使用上述兩種格式時,這些設置實際上會被忽略。總是,總是,總是使用上述兩種格式之一。如果您將變數作為字元串傳遞,請停止這樣做。如果不能,請檢查以確保它
ISDATE()
首先通過。如果您讓人們在表單欄位中輸入任何日期字元串,也請停止這樣做。在將字元串傳遞給 SQL Server 之前,使用日期選擇器或日曆控制項並指定字元串的格式。好吧,根據語言,只需將其保留為日期時間值,根本不要將其轉換為字元串。
- 我根本無法重現您的問題,順便說一句…
請閱讀這篇文章:
有一個例外:
SELECT CONVERT(DATE, 'yyyy-mm-dd');
不會破。但是我在一致性方面犯了錯誤,而不是只在我知道它不會破壞的一個地方使用一種格式,而在其他任何地方都必須使用一種更安全的格式。