SQL Server CONVERT() 函數 (格式化日期時間顯示)
CONVERT() 是 SQL Server 中用來進行資料型別轉換的函數。在日期時間處理方面,它常被用來將日期時間值格式化為指定格式的字串顯示。
CONVERT() 語法 (Syntax)
CONVERT(data_type[(length)], expression [, style])
- data_type:目標資料型別(如
varchar,datetime,date等)。 - length:可選,指定目標資料型別的長度(如
varchar(20))。 - expression:要轉換的來源值。
- style:可選,指定日期時間的顯示格式(見下方表格)。
日期時間格式的 style 值
| style (不含世紀 yy) | style (含世紀 yyyy) | 說明 | 輸出格式範例 |
|---|---|---|---|
| - | 0 或 100 | 預設值 | Nov 22 2024 2:30PM |
| 1 | 101 | 美國格式 | 11/22/2024 |
| 2 | 102 | ANSI | 2024.11.22 |
| 3 | 103 | 英國/法國格式 | 22/11/2024 |
| 4 | 104 | 德國格式 | 22.11.2024 |
| 5 | 105 | 義大利格式 | 22-11-2024 |
| 6 | 106 | - | 22 Nov 2024 |
| 7 | 107 | - | Nov 22, 2024 |
| 8 或 108 | 8 或 108 | 24 小時制時間 | 14:30:45 |
| - | 9 或 109 | 預設 + 毫秒 | Nov 22 2024 2:30:45:123PM |
| 10 | 110 | 美國格式 (連字號) | 11-22-2024 |
| 11 | 111 | 日本格式 | 2024/11/22 |
| 12 | 112 | ISO 格式 | 20241122 |
| - | 13 或 113 | 歐洲預設 + 毫秒 | 22 Nov 2024 14:30:45:123 |
| 14 或 114 | 14 或 114 | 24 小時制 + 毫秒 | 14:30:45:123 |
| - | 20 或 120 | ODBC 標準 | 2024-11-22 14:30:45 |
| - | 21 或 121 | ODBC 標準 + 毫秒 | 2024-11-22 14:30:45.123 |
| - | 126 | ISO 8601 | 2024-11-22T14:30:45.123 |
| - | 127 | ISO 8601 + 時區 | 2024-11-22T14:30:45.123Z |
CONVERT() 函數用法範例 (Example)
基本日期格式轉換
-- 預設格式
SELECT CONVERT(varchar, GETDATE(), 100);
-- 結果:Nov 22 2024 2:30PM
-- 美國格式 mm/dd/yyyy
SELECT CONVERT(varchar, GETDATE(), 101);
-- 結果:11/22/2024
-- 日本格式 yyyy/mm/dd
SELECT CONVERT(varchar, GETDATE(), 111);
-- 結果:2024/11/22
-- ISO 格式 yyyymmdd
SELECT CONVERT(varchar, GETDATE(), 112);
-- 結果:20241122
ODBC 標準格式
-- ODBC 標準(不含毫秒)
SELECT CONVERT(varchar, GETDATE(), 120);
-- 結果:2024-11-22 14:30:45
-- ODBC 標準(含毫秒)
SELECT CONVERT(varchar, GETDATE(), 121);
-- 結果:2024-11-22 14:30:45.123
ISO 8601 格式
SELECT CONVERT(varchar, GETDATE(), 126);
-- 結果:2024-11-22T14:30:45.123
SELECT CONVERT(varchar, GETDATE(), 127);
-- 結果:2024-11-22T14:30:45.123Z
只取時間部分
SELECT CONVERT(varchar, GETDATE(), 108);
-- 結果:14:30:45
SELECT CONVERT(varchar, GETDATE(), 114);
-- 結果:14:30:45:123
不含世紀 (兩位數年份)
SELECT CONVERT(varchar, GETDATE(), 1);
-- 結果:11/22/24
SELECT CONVERT(varchar, GETDATE(), 11);
-- 結果:24/11/22
實際應用範例
格式化訂單日期顯示
SELECT
order_id,
CONVERT(varchar, order_date, 111) AS order_date_formatted
FROM orders;
| order_id | order_date_formatted |
|---|---|
| 1 | 2024/11/22 |
| 2 | 2024/11/23 |
產生檔案名稱
SELECT 'backup_' + CONVERT(varchar, GETDATE(), 112) + '_' +
REPLACE(CONVERT(varchar, GETDATE(), 108), ':', '') + '.bak' AS backup_filename;
-- 結果:backup_20241122_143045.bak
日誌記錄時間戳記
INSERT INTO logs (message, created_at_string)
VALUES ('User logged in', CONVERT(varchar, GETDATE(), 121));
比較不同格式
SELECT
GETDATE() AS original,
CONVERT(varchar, GETDATE(), 100) AS style_100,
CONVERT(varchar, GETDATE(), 101) AS style_101,
CONVERT(varchar, GETDATE(), 111) AS style_111,
CONVERT(varchar, GETDATE(), 120) AS style_120,
CONVERT(varchar, GETDATE(), 126) AS style_126;
字串轉日期
CONVERT() 也可以將字串轉換為日期型別:
-- 將字串轉換為日期
SELECT CONVERT(datetime, '2024-11-22');
-- 結果:2024-11-22 00:00:00.000
SELECT CONVERT(datetime, '11/22/2024', 101);
-- 結果:2024-11-22 00:00:00.000
SELECT CONVERT(datetime, '22/11/2024', 103);
-- 結果:2024-11-22 00:00:00.000
FORMAT() 函數(SQL Server 2012+)
SQL Server 2012 引入了 FORMAT() 函數,提供更靈活的格式化選項:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd');
-- 結果:2024-11-22
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日');
-- 結果:2024年11月22日
SELECT FORMAT(GETDATE(), 'dddd, MMMM d, yyyy');
-- 結果:Friday, November 22, 2024
SELECT FORMAT(GETDATE(), 'HH:mm:ss');
-- 結果:14:30:45
CONVERT() vs FORMAT() 比較
| 特性 | CONVERT() | FORMAT() |
|---|---|---|
| 效能 | 較快 | 較慢(基於 .NET) |
| 靈活性 | 固定的 style 選項 | 自定義格式字串 |
| 可用版本 | 所有版本 | SQL Server 2012+ |
| 多語系支援 | 有限 | 支援地區設定 (culture) |
對於大量資料處理,建議優先使用 CONVERT();對於需要自定義格式或多語系的場景,使用 FORMAT()。
CAST() vs CONVERT()
CAST() 是 ANSI SQL 標準,CONVERT() 是 SQL Server 的專有函數:
-- CAST(不支援 style 參數)
SELECT CAST(GETDATE() AS varchar);
-- 結果:Nov 22 2024 2:30PM
-- CONVERT(支援 style 參數)
SELECT CONVERT(varchar, GETDATE(), 111);
-- 結果:2024/11/22
如果不需要指定日期格式,兩者都可以使用。如果需要特定格式,必須使用 CONVERT() 或 FORMAT()。