將常值日期字串轉換成 DATE 值的非決定性轉換
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
Analytics Platform System (PDW)
允許將您的 CHARACTER 字串轉換成 DATE 資料類型時請務必小心。 原因是這類轉換通常都是「非決定性」。
您可以透過說明 SET LANGUAGE 和 SET DATEFORMAT 的設定來控制這些非決定性轉換。
SET LANGUAGE 範例:波蘭文的月份名稱
SET LANGUAGE Polish;
字元字串可以是月份的名稱。 但名稱是英文、波蘭文、克羅埃西亞文或其他語言? 此外,使用者的工作階段是否會設為正確對應語言?
例如,假設一個單字 listopad,此為月份的名稱。 但該月份會根據 SQL 系統相信其正在使用的語言而有所不同:
- 若是波蘭文,則 listopad 可翻譯成 11 月 (即英文中的 November)。
- 若是克羅埃西亞文,則 listopad 可翻譯成 10 月 (即英文中的 October)。
SET LANGUAGE 的程式碼範例
--SELECT alias FROM sys.syslanguages ORDER BY alias;
DECLARE @yourInputDate NVARCHAR(32) = '28 listopad 2018';
SET LANGUAGE Polish;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Polish];
SET LANGUAGE Croatian;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Croatian];
SET LANGUAGE English;
/*** Actual output: For the two months, note the 11 versus the 10.
SL_Polish
2018-11-28
SL_Croatian
2018-10-28
***/
SET DATEFORMAT 範例
SET DATEFORMAT dmy;
上述 dmy 格式表示範例日期字串 '01-03-2018' 會解譯為表示「2018 年 3 月的第一天」。
若改為指定 mdy,則相同的 '01-03-2018' 字串就會表示「2018 年 1 月的第三天」。
若指定 ymd,則無法保證輸出結果為何。 '2018' 的數值對天來說太大了。
特定國家/區域
在日本和中國,會使用 ymd 的 DATEFORMAT。 格式部分為由大單位至小單位的合理順序。 因此,此格式的排序狀況良好。 此格式被視為是「國際」格式。 其為國際格式的原因是四位數年份並不明確,且目前在地球上沒有任何國家/區域使用古老的 ydm 格式。
在其他國家/區域 (例如德國和法國) 中,DATEFORMAT 為 dmy,表示 'dd-mm-yyyy'。 dmy 格式的排序狀況不良,但仍然是由小單位到大單位的合理順序。
美國和密克羅尼西亞聯邦是使用 mdy 的唯二國家/區域,此格式無法排序。 格式的混合順序符合語音上說明日期的模式。
SET DATEFORMAT 的程式碼範例:mdy 與 dmy
下列 Transact-SQL 程式碼範例會使用相同日期字元字串,搭配三種不同的 DATEFORMAT 設定。 執行程式碼會產生如註解中的輸出:
DECLARE @yourDateString NVARCHAR(10) = '12-09-2018';
PRINT @yourDateString + ' = the input.';
SET DATEFORMAT dmy;
SELECT CONVERT(DATE, @yourDateString) AS [DMY-Interpretation-of-input-format];
SET DATEFORMAT mdy;
SELECT CONVERT(DATE, @yourDateString) AS [MDY-Interpretation-of-input-format];
SET DATEFORMAT ymd;
SELECT CONVERT(DATE, @yourDateString) AS [YMD-Interpretation--?--NotGuaranteed];
/*** Actual output:
12-09-2018 = the input.
DMY-Interpretation-of-input-format
2018-09-12
MDY-Interpretation-of-input-format
2018-12-09
YMD-Interpretation--?--NotGuaranteed
2018-12-09
***/
在上述程式碼範例中,最後一個範例的格式 ymd 與輸入字串不符。 輸入字串之第三個節點表示對天來說太大的數值。 Microsoft 不保證這類不相符所產生的輸出值。
CONVERT 可提供「決定性」日期格式控制的明確程式碼
我們的 CAST 和 CONVERT 文件文章會列出您可以與 CONVERT 函式「決定性地」控制日期轉換搭配使用的明確程式碼。 每個月該文章都擁有我們最高的頁面瀏覽次數。
相容性層級 90 及以上
在 SQL Server 2000 中,相容性層級為 80。 針對層級設定 80 或以下,隱含日期轉換具決定性。
從 SQL Server 2005 和其相容性層級 90 開始,隱含日期轉換不具決定性。 從層級 90 開始,日期轉換依存於 SET LANGUAGE 和 SET DATEFORMAT。
Unicode
非 Unicode 字元資料與定序之間的轉換也被視為非決定性。