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
1101美國格式11/22/2024
2102ANSI2024.11.22
3103英國/法國格式22/11/2024
4104德國格式22.11.2024
5105義大利格式22-11-2024
6106-22 Nov 2024
7107-Nov 22, 2024
8 或 1088 或 10824 小時制時間14:30:45
-9 或 109預設 + 毫秒Nov 22 2024 2:30:45:123PM
10110美國格式 (連字號)11-22-2024
11111日本格式2024/11/22
12112ISO 格式20241122
-13 或 113歐洲預設 + 毫秒22 Nov 2024 14:30:45:123
14 或 11414 或 11424 小時制 + 毫秒14:30:45:123
-20 或 120ODBC 標準2024-11-22 14:30:45
-21 或 121ODBC 標準 + 毫秒2024-11-22 14:30:45.123
-126ISO 86012024-11-22T14:30:45.123
-127ISO 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_idorder_date_formatted
12024/11/22
22024/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()

更多 SQL Server 相關的日期時間函數在這邊
更多 MySQL 相關的日期時間函數在這邊