常用日期運算函數
| 函數 | 用途 | 範例 |
DATEADD(interval, number, date) | 日期加減 | DATEADD(month, 2, GETDATE()) 兩個月後 |
DATEDIFF(interval, startdate, enddate) | 日期差值 | DATEDIFF(day, time_col, GETDATE()) 相差天數 |
查詢整數週期資料範例
1. 查詢「剛好」整月/整天的資料
-- 整月週期(如每月 1 號產生的資料)
SELECT * FROM tb
WHERE DATEDIFF(month, time_col, GETDATE()) = 0
AND DAY(time_col) = DAY(GETDATE());
-- 整天週期(同一天不同時刻)
SELECT * FROM tb
WHERE DATEDIFF(day, time_col, GETDATE()) = 0;
2. 精確到小時/分鐘
-- 整小時
SELECT * FROM tb
WHERE DATEDIFF(hour, time_col, GETDATE()) = 0;
-- 整分鐘
SELECT * FROM tb
WHERE DATEDIFF(minute, time_col, GETDATE()) = 0;
3. 使用 DATEADD 反向比對(效能較佳,可用索引)
-- 兩個月前的同一天同時刻
SELECT * FROM tb
WHERE time_col = DATEADD(month, -2, GETDATE());
-- 七天前
SELECT * FROM tb
WHERE time_col = DATEADD(day, -7, GETDATE());
4. 儲存程序檢測是否為整數週期
DECLARE @num INT = 2;
IF DATEADD(day, @num, '2010-01-05 01:00') = GETDATE()
OR DATEADD(month, 2, '2010-01-05 01:00') = GETDATE()
PRINT '是整數週期'
ELSE
PRINT '非整數週期'
效能建議
- 避免在 WHERE 欄位上使用函數(如
DATEDIFF(day, col, GETDATE()) = 0),會導致索引失效。
- 改用 範圍查詢:
col >= DATEADD(day, -1, CAST(GETDATE() AS DATE)) AND col < CAST(GETDATE() AS DATE)
- 若頻繁查詢特定週期,考慮建立 計算欄位 或 索引檢視表。