CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
style 僅在 datetime/smalldatetime 與字符串類型互轉時生效,決定輸出/解析格式。
| Style | 標準/說明 | 輸出示例 (假設 2024-01-15 10:30:45.123) |
|---|---|---|
| 0 / 100* | 默認 | Jan 15 2024 10:30AM |
| 1 | 美國 | 01/15/24 |
| 101 | 美國 (4位年) | 01/15/2024 |
| 2 | ANSI | 24.01.15 |
| 102 | ANSI (4位年) | 2024.01.15 |
| 3 | 英國/法國 | 15/01/24 |
| 103 | 英國/法國 (4位年) | 15/01/2024 |
| 4 | 德國 | 15.01.24 |
| 104 | 德國 (4位年) | 15.01.2024 |
| 5 | 意大利 | 15-01-24 |
| 105 | 意大利 (4位年) | 15-01-2024 |
| 6 | - | 15 Jan 24 |
| 106 | - (4位年) | 15 Jan 2024 |
| 7 | - | Jan 15, 24 |
| 107 | - (4位年) | Jan 15, 2024 |
| 8 | 僅時間 | 10:30:45 |
| 108 | 僅時間 | 10:30:45 |
| 9 / 109* | 默認+毫秒 | Jan 15 2024 10:30:45:123AM |
| 10 | 美國 | 01-15-24 |
| 110 | 美國 (4位年) | 01-15-2024 |
| 11 | 日本 | 24/01/15 |
| 111 | 日本 (4位年) | 2024/01/15 |
| 12 | ISO (無分隔) | 240115 |
| 112 | ISO (4位年無分隔) | 20240115 |
| 13 / 113* | 歐洲默認+毫秒 (24h) | 15 Jan 2024 10:30:45:123 |
| 14 | 僅時間+毫秒 (24h) | 10:30:45:123 |
| 114 | 僅時間+毫秒 (24h) | 10:30:45:123 |
| 20 / 120* | ODBC 標準 | 2024-01-15 10:30:45 |
| 21 / 121* | ODBC + 毫秒 | 2024-01-15 10:30:45.123 |
| 22 | 美國 + 秒 | 01/15/24 10:30:45 AM |
| 23 | ISO 日期 (無時間) | 2024-01-15 |
| 24 | 僅時間 (無秒) | 10:30:45 |
| 25 | ODBC + .fff | 2024-01-15 10:30:45.250 |
| 126*** | ISO8601 (XML) | 2024-01-15T10:30:45.123 |
| 130* | Hijri (伊斯蘭曆) | 03 Rajab 1445 10:30:45:123AM |
| 131* | Hijri | 03/07/1445 10:30:45:123AM |
註:* 表示默認值始終含世紀位;*** 僅用於 XML 輸出。
-- 無世紀位 (0-25)
SELECT CONVERT(VARCHAR(100), GETDATE(), 0) AS Style0;
SELECT CONVERT(VARCHAR(100), GETDATE(), 1) AS Style1;
-- ... 依次至 25
-- 保留號碼 15-19, 26-31 通常無效/保留
-- 有世紀位 (100-131)
SELECT CONVERT(VARCHAR(100), GETDATE(), 100) AS Style100;
SELECT CONVERT(VARCHAR(100), GETDATE(), 101) AS Style101;
-- ... 依次至 131
-- 保留號碼 115-119, 122-125, 127-129 通常無效/保留
| 需求 | 推薦 Style | 輸出格式 | 適用場景 |
|---|---|---|---|
| 標準日期 (可排序) | 23 / 120 / 112 | YYYY-MM-DD / YYYYMMDD | 文件名、分區鍵、日志、API 交互 |
| 標準日期時間 | 120 / 121 | YYYY-MM-DD HH:MI:SS[.fff] | 數據交換、存儲、日志、跨系統 |
| 中文常用顯示 | 111 | YYYY/MM/DD | 報表、界面顯示 |
| 精確到毫秒 | 121 / 126 | YYYY-MM-DD HH:MI:SS.fff | 高精度時間戳、審計、排序 |
| ISO8601 / JSON | 126 | YYYY-MM-DDTHH:MI:SS.fff | REST API、XML、JSON、現代前端 |
| 僅時間 | 8 / 108 / 14 / 114 | HH:MI:SS[.fff] | 打卡、排班、耗時統計 |
-- 需求:將表中所有 DATETIME 列統一按 Style 120 輸出
DECLARE @sql NVARCHAR(MAX) = N'', @tbl SYSNAME = 'YourTable';
SELECT @sql += N', CONVERT(VARCHAR(23), ' + QUOTENAME(c.name) + N', 120) AS ' + QUOTENAME(c.name)
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID(@tbl) AND t.name IN ('datetime','smalldatetime','datetime2');
SET @sql = N'SELECT ' + STUFF(@sql, 1, 1, N'') + N' FROM ' + QUOTENAME(@tbl);
EXEC sp_executesql @sql;
DATE, TIME, DATETIME2, DATETIMEOFFSET 類型,CONVERT 全支持。FORMAT() 做複雜本地化格式,但性能較 CONVERT 低 3-5 倍。-- 解析時 style 必須與字符串實際格式匹配
SELECT CONVERT(DATETIME, '2024-01-15', 120); -- 成功
SELECT CONVERT(DATETIME, '01/15/2024', 101); -- 成功
SELECT CONVERT(DATETIME, '15-01-2024', 105); -- 成功
-- 格式不匹配會報錯或產生錯誤日期
-- SELECT CONVERT(DATETIME, '2024-01-15', 101); -- 錯誤或錯誤結果
-- 2012+ 安全解析
SELECT TRY_CONVERT(DATETIME, 'invalid', 120); -- 返回 NULL