CONVERT() 是 SQL Server 將日期時間、數值等型別轉換為字串 (或反之) 的核心函數,其第三個參數 style 提供豐富的日期時間格式化選項。本文整理完整樣式代碼對照表、常用格式範例與最佳實務。
CONVERT( data_type [ ( length ) ] , expression [ , style ] )
data_type:目標型別 (常用 VARCHAR, NVARCHAR, DATE, DATETIME 等)。expression:待轉換的運算式 (如 GETDATE()、欄位、變數)。style:日期時間格式代碼,僅適用於日期/時間型別轉字串;數值轉換通常忽略此參數。| Style ID | 輸出格式範例 | 說明 | 標準/備註 |
|---|---|---|---|
| 0 / 100 | Mon DD YYYY HH:MIAM/PM | 預設、美式含毫秒 | mon dd yyyy hh:miAM |
| 101 | MM/DD/YYYY | 美式日期 | mm/dd/yy |
| 102 | YYYY.MM.DD | ANSI 標準 | yy.mm.dd |
| 103 | DD/MM/YYYY | 英式/歐式日期 | dd/mm/yy |
| 104 | DD.MM.YYYY | 德式日期 | dd.mm.yy |
| 105 | DD-MM-YYYY | 義式日期 | dd-mm-yy |
| 106 | DD MON YY | 簡短月份名 | dd mon yy |
| 107 | MON DD, YY | 月份名含逗號 | Mon dd, yy |
| 108 | HH:MI:SS | 純時間 24 小時 | hh:mm:ss |
| 9 / 109 | MON DD YYYY HH:MI:SS:MMMAM/PM | 含毫秒完整時間 | mon dd yyyy hh:mi:ss:mmmAM |
| 110 | MM-DD-YYYY | 美式連字號 | mm-dd-yy |
| 111 | YYYY/MM/DD | 日式/標準 | yy/mm/dd |
| 112 | YYYYMMDD | 無分隔符,排序友善 | yymmdd |
| 13 / 113 | DD MON YYYY HH:MI:SS:MMM | 歐洲預設 24 小時含毫秒 | dd mon yyyy hh:mm:ss:mmm(24h) |
| 114 | HH:MI:SS:MMM | 純時間含毫秒 24h | hh:mi:ss:mmm(24h) |
| 20 / 120 | YYYY-MM-DD HH:MI:SS | ODBC 標準 24h | yyyy-mm-dd hh:mi:ss(24h) |
| 21 / 121 | YYYY-MM-DD HH:MI:SS.MMM | ODBC 擴展含毫秒 | yyyy-mm-dd hh:mi:ss.mmm(24h) |
| 126 | YYYY-MM-DDTHH:MI:SS.MMM | ISO 8601 (無空格) | yyyy-mm-ddThh:mm:ss.mmm |
| 130 | DD MON YYYY HH:MI:SS:MMMAM/PM | 回曆/伊斯蘭曆 | dd mon yyyy hh:mi:ss:mmmAM |
| 131 | DD/MM/YY HH:MI:SS:MMMAM/PM | 回曆短格式 | dd/mm/yy hh:mi:ss:mmmAM |
-- 1. 純日期 (YYYYMMDD) - 檔名、分割鍵、比對最佳
SELECT CONVERT(VARCHAR(8), GETDATE(), 112); -- 20241219
-- 2. 標準日期時間 (YYYY-MM-DD HH:MI:SS) - 日誌、API、匯出
SELECT CONVERT(VARCHAR(19), GETDATE(), 120); -- 2024-12-19 14:30:45
-- 3. 含毫秒完整時間 (ISO 8601) - 精確排序、跨系統交換
SELECT CONVERT(VARCHAR(23), GETDATE(), 121); -- 2024-12-19 14:30:45.123
SELECT CONVERT(VARCHAR(24), GETDATE(), 126); -- 2024-12-19T14:30:45.123
-- 4. 顯示友善格式 (中文環境常用)
SELECT CONVERT(VARCHAR(11), GETDATE(), 106); -- 19 Dec 2024
SELECT CONVERT(VARCHAR(10), GETDATE(), 111); -- 2024/12/19
-- 5. 純時間
SELECT CONVERT(VARCHAR(8), GETDATE(), 108); -- 14:30:45
SELECT CONVERT(VARCHAR(12), GETDATE(), 114); -- 14:30:45.123
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss', 'zh-TW'); -- 2024-12-19 14:30:45
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日 dddd', 'zh-TW'); -- 2024年12月19日 星期四
CONVERT。
-- 危險:依賴伺服器語言/日期格式設定
SELECT CAST('12/31/2024' AS DATETIME); -- 美式環境 OK,英式環境錯誤
-- 安全:明確指定 style
SELECT CONVERT(DATETIME, '2024-12-31', 120); -- ISO 格式通用
SELECT CONVERT(DATETIME, '31/12/2024', 103); -- 英式格式
-- 錯誤示範:字串比較/運算
WHERE CONVERT(VARCHAR(10), OrderDate, 112) = '20241219'
-- 正確:SARGable 索引可用
WHERE OrderDate >= '2024-12-19' AND OrderDate < '2024-12-20'
-- 或 SQL 2008+
WHERE CAST(OrderDate AS DATE) = '2024-12-19'
-- 錯誤:長度 10 截斷毫秒
SELECT CONVERT(VARCHAR(10), GETDATE(), 121); -- 2024-12-19
-- 正確:至少 19 (無毫秒) 或 23 (含毫秒)
SELECT CONVERT(VARCHAR(23), GETDATE(), 121);
DECLARE @styles TABLE (id INT PRIMARY KEY, descr VARCHAR(100));
INSERT INTO @styles VALUES
(0,'Default'),(101,'US'),(102,'ANSI'),(103,'UK'),(104,'German'),(105,'Italian'),
(106,'Short Mon'),(107,'Mon DD, YY'),(108,'Time'),(9,'Default+ms'),(110,'US-'),
(111,'JP'),(112,'ISO Date'),(13,'Euro+ms'),(114,'Time+ms'),(20,'ODBC'),(21,'ODBC+ms'),
(126,'ISO8601'),(130,'Hijri'),(131,'Hijri Short');
SELECT id, descr, CONVERT(VARCHAR(30), GETDATE(), id) AS output
FROM @styles
ORDER BY id;
CONVERT() 配合 style 代碼是 SQL Server 日期時間格式化的利器。牢記 112 (YYYYMMDD)、120 (ODBC)、121 (含毫秒)、126 (ISO8601) 四大黃金格式,搭配 FORMAT() 處理報表顯示層,並堅持「運算用原生型別、顯示才轉字串」原則,即能寫出正確、高效、可攜的日期處理程式碼。