在資料處理與 ETL 流程中,「日期欄位型態轉換」幾乎每天都會遇到。尤其在資料倉儲(Data Warehouse)、報表系統、BI系統( QlikView/Tableau )分析時,日期格式不一致是最常見的問題之一。這篇整理 SQL Server 常用的日期轉換技巧與實戰寫法。
Table of Contents
一、常見日期欄位型態
實務上最常看到的日期格式(如下表),從不同系統(ERP、POS、舊系統)存取的資料,會把日期存成 INT 或 VARCHAR,因此學會轉換非常重要。
| 型態 | 範例 |
|---|---|
| DATE | 2026-06-02 |
| DATETIME | 2026-06-02 14:30:00 |
| VARCHAR | ‘20260602’ |
| INT | 20260602 |
| YYYYMM | 202606 |
二、字串轉 DATE
YYYYMMDD → DATE
SELECT CAST('20260602' AS DATE)
--若格式不是標準日期格式:
SELECT CONVERT(DATE, '20260602')
轉換結果:
2026-06-02
三、INT 日期轉 DATE
很多資料倉儲都會用 INT 儲存日期:
20260602
轉換方式:
--方法1.
SELECT CAST(CAST(20260602 AS VARCHAR) AS DATE)
--方法2.
SELECT CONVERT(DATE, CONVERT(VARCHAR, 20260602))
四、DATE 轉 YYYYMMDD
將日期轉成字串
SELECT CONVERT(VARCHAR, GETDATE(), 112)
--112 格式代表:YYYYMMDD
轉換結果:
20260602
五、DATE 轉 YYYYMM
這在建立月份欄位時非常常用。
方法 1:LEFT 先將日期轉換為字串格式YYYYMMDD後,再取前六位數
SELECT LEFT(CONVERT(VARCHAR, GETDATE(), 112), 6)
轉換結果:
202606
方法 2:FORMAT(較直觀),但 FORMAT 效能較差,大量資料不建議。
SELECT FORMAT(GETDATE(), 'YYYYMM')
六、DATE 轉 INT
YYYYMMDD INT
SELECT CAST(CONVERT(VARCHAR, GETDATE(), 112) AS INT)
結果:
20260602
七、取得年度
1. 取得西元年 YEAR( )
SELECT YEAR(GETDATE())
-- 取得今天日期 GETDATE()
-- 轉換結果 2026
2. 取得月份 MONTH( )
SELECT MONTH(GETDATE())
-- 轉換結果 6
3. 取得日期 DAY( )
SELECT DAY(GETDATE())
八、取得近 180 天日期
常應用於ETL 與增量更新 。
-- DATE 型態
SELECT DATEADD(DAY, -180, GETDATE())
-- 轉為 YYYYMMDD INT
SELECT CAST(
CONVERT(VARCHAR, DATEADD(DAY, -180, GETDATE()) ,112)
AS INT)
--轉換結果: 20251204
九、日期比較技巧
避免這樣寫,因為 DATETIME 含時間。
WHERE OrderDate = GETDATE()
正確寫法
-- 方法1
WHERE CAST(OrderDate AS DATE) = CAST(GETDATE() AS DATE)
-- 方法2 效能通常較好
WHERE OrderDate >= CAST(GETDATE() AS DATE)
AND OrderDate < DATEADD(DAY, 1, CAST(GETDATE() AS DATE))
十、常見 FORMAT 對照表
| 格式碼 | 結果 |
|---|---|
| 112 | 20260602 |
| 111 | 2026/06/02 |
| 120 | 2026-06-02 14:30:00 |
| 23 | 2026-06-02 |
範例:
SELECT CONVERT(VARCHAR, GETDATE(), 120)
十一、實務建議
在資料倉儲中,建置事實表Fact Table 時,事實表常會:
- 保留 DATE 欄位
- 另外建立 DateKey(INT)
例如:
| DateKey | OrderDate |
|---|---|
| 20260602 | 2026-06-02 |
優點:
- Join 快
- Partition 好做
- BI 工具容易處理
十二、效能注意事項
避免在 WHERE 對欄位做函數,不建議:
WHERE CONVERT(VARCHAR, OrderDate, 112) = '20260602'
因為會造成:
- Index 失效
- 全表掃描
建議寫法
WHERE OrderDate >= '2026-06-02'
AND OrderDate < '2026-06-03'
效能通常最好。
十三、總結
SQL 日期轉換是資料工程最基礎也最重要的技能之一,實務上最常用的技巧:
- CONVERT()
- CAST()
- DATEADD()
- YEAR / MONTH / DAY
- YYYYMMDD INT 轉換
熟悉以上技巧後,在執行以下分析工作時,也會更得心應手。尤其在大量資料環境中:「日期格式一致」與「避免函數造成索引失效」非常重要。
- ETL
- DW 建模
- BI 報表
- Tableau / QlikView 分析
以下提供<SQL-日期欄位型態轉換筆記>的PDF,提供給同樣在精進資料分析技能的人~~