核心語法
CONVERT(VARCHAR(100), datetime_expression, style)
-- style 參數決定輸出格式,以下為完整對照 (基準 2006-05-16 10:57:49.123)
完整 Style 代碼對照表 (含 Hijri 曆)
| Style | 輸出範例 | 標準/說明 | 世紀位 |
| 0 / 100 | May 16 2006 10:57AM | 預設 | 100=yyyy |
| 1 / 101 | 05/16/2006 | 美國 | 101=yyyy |
| 2 / 102 | 2006.05.16 | ANSI | 102=yyyy |
| 3 / 103 | 16/05/2006 | 英國/法國 | 103=yyyy |
| 4 / 104 | 16.05.2006 | 德國 | 104=yyyy |
| 5 / 105 | 16-05-2006 | 義大利 | 105=yyyy |
| 6 / 106 | 16 May 2006 | - | 106=yyyy |
| 7 / 107 | May 16, 2006 | - | 107=yyyy |
| 8 / 108 | 10:57:49 | 時間 | - |
| 9 / 109 | May 16 2006 10:57:49:123AM | 預設+毫秒 | 109=yyyy |
| 10 / 110 | 05-16-2006 | 美國 | 110=yyyy |
| 11 / 111 | 2006/05/16 | 日本 | 111=yyyy |
| 12 / 112 | 20060516 | ISO | 112=yyyy |
| 13 / 113 | 16 May 2006 10:57:49:123 | 歐洲預設+毫秒 (24h) | 113=yyyy |
| 14 / 114 | 10:57:49:123 | 時間+毫秒 (24h) | - |
| 20 / 120 | 2006-05-16 10:57:49 | ODBC 規範 | 120=yyyy |
| 21 / 121 | 2006-05-16 10:57:49.123 | ODBC+毫秒 | 121=yyyy |
| 126 | 2006-05-16T10:57:49.123 | ISO8601 (XML/JSON) | yyyy |
| 130 | 18 ??? ????? 1427 10:57:49:123AM | Hijri (伊斯蘭曆) 科威特演算法 | yyyy |
| 131 | 18/04/1427 10:57:49:123AM | Hijri | yyyy |
關鍵規律
- Style ≥ 100 含世紀 (yyyy),Style < 100 僅兩位年 (yy)
- 生產環境嚴禁使用 < 100:兩位年會觸發 2049/2030 截斷年問題
- 無歧義通用格式:120 (ODBC)、121 (ODBC+毫秒)、126 (ISO8601)
- 截斷控制:
VARCHAR(10) 只取日期,19 含秒,23 含毫秒
最佳實踐建議
| 場景 | 推薦 Style | 範例 |
| API/JSON/日誌/跨系統 | 126 | 2023-09-22T10:57:49.123 |
| 資料庫間 ETL/匯入匯出 | 121 | 2023-09-22 10:57:49.123 |
| 報表/人工閱讀 (中文) | 111 或 120 | 2023/09/22 或 2023-09-22 |
| 僅日期索引/分區 | 112 | 20230922 |
| 字串解析 → 日期 | 同輸出 Style | CONVERT(DATETIME, '2023-09-22', 120) |
參數說明 (官方文檔摘錄)
data_type:目標型別 (char/varchar/nchar/nvarchar/binary/varbinary)
length:字串型別可選長度,預設 30
expression:任意合法運算式
style:日期/數值格式代碼,NULL 返回 NULL
兩位數年份截斷年配置
-- 查看當前截斷年 (預設 2049)
EXEC sp_configure 'two digit year cutoff';
-- 修改為 2030 (相容舊應用)
EXEC sp_configure 'two digit year cutoff', 2030; RECONFIGURE;
-- 建議:程式碼層面統一四位年,不依賴此設定