Posted in

[SQL] 日期欄位型態轉換筆記|資料倉儲.MSSQL

big, data, keyboard, computer, internet, online, www, surfing, amount of data, word, flood of data, database, bulk data, collect, evaluate, data volume, data retention, data storage, market research, records, data processing, complex, data collection, database, database, database, database, database, market research, data collection

在資料處理與 ETL 流程中,「日期欄位型態轉換」幾乎每天都會遇到。尤其在資料倉儲(Data Warehouse)、報表系統、BI系統( QlikView/Tableau )分析時,日期格式不一致是最常見的問題之一。這篇整理 SQL Server 常用的日期轉換技巧與實戰寫法。

一、常見日期欄位型態

實務上最常看到的日期格式(如下表),從不同系統(ERP、POS、舊系統)存取的資料,會把日期存成 INT 或 VARCHAR,因此學會轉換非常重要。

型態範例
DATE2026-06-02
DATETIME2026-06-02 14:30:00
VARCHAR‘20260602’
INT20260602
YYYYMM202606

二、字串轉 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 對照表

格式碼結果
11220260602
1112026/06/02
1202026-06-02 14:30:00
232026-06-02

範例:

SELECT CONVERT(VARCHAR, GETDATE(), 120)

十一、實務建議

在資料倉儲中,建置事實表Fact Table 時,事實表常會:

  • 保留 DATE 欄位
  • 另外建立 DateKey(INT)

例如:

DateKeyOrderDate
202606022026-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,提供給同樣在精進資料分析技能的人~~