日期時間運算是業務邏輯高頻區。掌握五大核心函數與 interval 參數表,覆蓋 90% 日期計算場景。
五大核心函數
| 函數 | 語法 | 返回 | 典型用例 |
GETDATE() | 無參數 | DATETIME | 當前系統時間 |
DATEADD | (interval, number, date) | DATETIME | 日期加減:DATEADD(day, 2, '2024-01-01') |
DATEDIFF | (interval, start, end) | INT | 間隔差:DATEDIFF(day, '2024-01-01', '2024-01-10') = 9 |
DATEPART | (interval, date) | INT | 數值部分:DATEPART(month, GETDATE()) |
DATENAME | (interval, date) | NVARCHAR | 名稱部分:DATENAME(weekday, GETDATE()) = '星期三' |
Interval 參數完整對照表
| 單位 | 縮寫 | 說明 |
| Year | yy, yyyy | 年 1753-9999 |
| Quarter | qq, q | 季度 1-4 |
| Month | mm, m | 月 1-12 |
| Day of Year | dy, y | 年內天數 1-366 |
| Day | dd, d | 日 1-31 |
| Weekday | dw, w | 周內天數 1-7 (周日=1) |
| Week | wk, ww | 年內周數 0-51 |
| Hour | hh, h | 時 0-23 |
| Minute | mi, n | 分 0-59 |
| Second | ss, s | 秒 0-59 |
| Millisecond | ms | 毫秒 0-999 |
實戰常用組合
-- 本月第一天
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
-- 本周一
DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)
-- 今年第一天
DATEADD(year, DATEDIFF(year, 0, GETDATE()), 0)
-- 今日零點
DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
-- 當前日期字符串
CONVERT(VARCHAR(10), GETDATE(), 120) -- '2024-01-15'
-- 當前時間字符串
CONVERT(VARCHAR(8), GETDATE(), 114) -- '14:30:25'
跨平台注意
- Access/ASP 用
Date()/Now() 獲取當前日期時間
DATEADD/DATEDIFF/DATEPART 語法一致,可移植
- SQL Server 2008+ 推薦
SYSDATETIME() (高精度) / SYSUTCDATETIME() (UTC)