所有公式均基於 GETDATE() 為例,實際使用請替換為目標日期欄位/變數。核心模式:DATEADD(interval, DATEDIFF(interval, 0, date) [+/- n], 0)。
-- 本月第一天 00:00:00
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);
-- 本月最後一天 23:59:59.997
SELECT DATEADD(ms, -3, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0));
-- 上月最後一天
SELECT DATEADD(ms, -3, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0));
-- 本週週一
SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0);
-- 本月第一個週一
SELECT DATEADD(week, DATEDIFF(week, 0,
DATEADD(day, 6 - DATEPART(day, GETDATE()), GETDATE())), 0);
-- 本年第一天
SELECT DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0);
-- 本年最後一天
SELECT DATEADD(ms, -3, DATEADD(year, DATEDIFF(year, 0, GETDATE()) + 1, 0));
-- 去年最後一天
SELECT DATEADD(ms, -3, DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0));
-- 本季度第一天
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0);
-- 本月資料
WHERE create_time >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
AND create_time < DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0);
-- 本週資料
WHERE create_time >= DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)
AND create_time < DATEADD(week, DATEDIFF(week, 0, GETDATE()) + 1, 0);
-- 本季資料
WHERE create_time >= DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()), 0)
AND create_time < DATEADD(quarter, DATEDIFF(quarter, 0, GETDATE()) + 1, 0);
| 需求 | 函數 | 範例結果 |
|---|---|---|
| 當月總天數 | DATEDIFF(day, GETDATE(), DATEADD(month, 1, GETDATE())) | 30 |
| 當前星期幾名稱 | DATENAME(weekday, GETDATE()) | 星期一 |
| 當前日期 (yyyy-mm-dd) | CONVERT(varchar(10), GETDATE(), 120) | 2024-05-20 |
| 當前時間 (hh:mi:ss) | CONVERT(varchar(8), GETDATE(), 114) | 14:30:00 |
DATEADD(ms, -3, ...) 用於將「下一個邊界 00:00:00.000」倒退 3 毫秒,得到上一個邊界的「23:59:59.997」,這是 SQL Server DATETIME 類型精度 (3.33ms) 下的最大值,確保涵蓋整天。