SQL Server 日期時間欄位格式化完整指南:CONVERT、FORMAT 與自訂樣式
日期時間格式化是報表匯出、API 序列化、跨系統整合的高頻需求。SQL Server 提供 CONVERT(傳統、高效能)、FORMAT(CLR、靈活)、DATEPART 組合等多種方式,本文系統整理並提供常用樣式速查表。
一、CONVERT 函數:高效能、樣式代碼固定
CONVERT(data_type(length), expression, style)
style:預定義格式代碼(見下表),**不支援自訂格式字串**。
- 效能優於
FORMAT,適合高頻、大量資料轉換。
常用樣式代碼速查表
| Style | 標準 | 輸出範例 | 備註 |
| 100 | 預設 | Mon DD YYYY HH:MIAM | 含毫秒 |
| 101 | 美國 | MM/DD/YYYY | |
| 102 | ANSI | YYYY.MM.DD | |
| 103 | 英/法 | DD/MM/YYYY | |
| 104 | 德 | DD.MM.YYYY | |
| 105 | 義 | DD-MM-YYYY | |
| 106 | — | DD MON YYYY | |
| 107 | — | MON DD, YYYY | |
| 108 | — | HH:MI:SS | 僅時間 |
| 110 | 美國 | MM-DD-YYYY | |
| 111 | 日本 | YYYY/MM/DD | |
| 112 | ISO | YYYYMMDD | 無分隔,適合排序/檔名 |
| 113 | ISO8601 | YYYY-MM-DDTHH:MI:SS.mmm | 含毫秒,XML/JSON 標準 |
| 120 | ODBC | YYYY-MM-DD HH:MI:SS | 24小時制,常用 |
| 121 | ODBC+毫秒 | YYYY-MM-DD HH:MI:SS.mmm | 高精度 |
| 126 | ISO8601 | YYYY-MM-DDTHH:MI:SS.mmm | 同 113,無時區 |
| 127 | ISO8601+時區 | YYYY-MM-DDTHH:MI:SS.mmmZ | UTC 時間 |
範例
SELECT CONVERT(VARCHAR(19), GETDATE(), 120) AS dt_120; -- 2024-01-15 14:30:45
SELECT CONVERT(VARCHAR(10), GETDATE(), 112) AS dt_112; -- 20240115
二、FORMAT 函數:.NET 自訂格式字串,極度靈活
FORMAT(value, format [, culture])
- 支援 .NET 自訂日期時間格式字串。
- 可指定
culture(如 'zh-TW'、'en-US')輸出本地化月份名稱等。
- **效能較 CONVERT 低**(CLR 呼叫開銷),大量列轉換慎用。
常用自訂格式範例
| 格式字串 | 輸出範例 | 說明 |
| yyyy-MM-dd | 2024-01-15 | ISO 日期 |
| yyyy/MM/dd HH:mm:ss | 2024/01/15 14:30:45 | 完整日期時間 |
| yyyy年MM月dd日 | 2024年01月15日 | 中文顯示 |
| HH:mm:ss.fff | 14:30:45.123 | 毫秒精度時間 |
| yyyy-MM-dd'T'HH:mm:ss.fffZ | 2024-01-15T14:30:45.123Z | ISO8601 UTC |
| ddd, dd MMM yyyy HH:mm:ss 'GMT' | Mon, 15 Jan 2024 14:30:45 GMT | RFC1123 (HTTP Header) |
範例
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss', 'zh-TW') AS fmt_zh;
SELECT FORMAT(GETDATE(), 'MMMM dd, yyyy', 'en-US') AS fmt_en; -- January 15, 2024
三、組合函數構建特殊格式(不依賴 FORMAT)
-- YYYYMMDDHHMMSS 檔名時間戳
SELECT REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ', ''), ':', '');
-- 僅取日期部分(移除時間)
SELECT CONVERT(DATE, GETDATE()); -- 2024-01-15 (DATE 型別)
SELECT CAST(GETDATE() AS DATE); -- 同效
四、時區處理:AT TIME ZONE (SQL Server 2016+)
-- 將 UTC 時間轉為台北時間
SELECT GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Taipei Standard Time';
-- 列出所有支援時區
SELECT * FROM sys.time_zone_info;
五、效能與選擇建議
| 場景 | 推薦函數 | 理由 |
| 大量列(>10萬)轉換 | CONVERT | 原生執行,無 CLR 開銷 |
| 報表/前端顯示、需本地化 | FORMAT | 格式字串直觀、支援文化特性 |
| ISO8601/JSON 序列化 | CONVERT(..., 126/127) | 標準代碼、效能佳 |
| 檔名/排序鍵 | CONVERT(..., 112) + REPLACE | 無分隔符、字典序即時間序 |
| 跨時區轉換 | AT TIME ZONE | 資料庫層處理、避免應用層時區庫 |
常見陷阱
CONVERT(VARCHAR, dt, 120) 若未指定長度,預設 30 字元可能截斷毫秒;建議明確 VARCHAR(23)(含毫秒)或 VARCHAR(19)(不含毫秒)。
FORMAT 在 WHERE 條件中使用會導致**索引失效**;篩選應在原始 DATETIME 欄位上進行,格式化僅用於 SELECT 輸出。
- 字串轉日期用
TRY_CONVERT / TRY_CAST(回傳 NULL 而非報錯),配合 CASE 處理髒資料。
依場景選擇 CONVERT(效能)或 FORMAT(彈性),善用樣式代碼速查表,即可高效完成各類日期時間格式化需求。