核心函數一覽
| 函數 | 用途 | 範例 | 結果說明 |
GETDATE() | 取得目前系統日期時間 | SELECT GETDATE() | 2024-01-15 14:30:45.123 |
DATEADD(interval, number, date) | 日期加減運算 | SELECT DATEADD(day, 2, '2004-10-15') | 2004-10-17 00:00:00.000 |
DATEDIFF(interval, start, end) | 兩日期差值(單位由 interval 決定) | SELECT DATEDIFF(day, '2004-09-01', '2004-09-18') | 17 |
DATEPART(interval, date) | 取得日期指定部分的整數值 | SELECT DATEPART(month, '2004-10-15') | 10 |
DATENAME(interval, date) | 取得日期指定部分的字串名稱 | SELECT DATENAME(weekday, '2004-10-15') | 星期五 |
DAY()/MONTH()/YEAR() | 取得日/月/年(等同 DATEPART 簡寫) | SELECT DAY(GETDATE()) | 15 |
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 |
| Week | wk, ww | 年間第幾週 | 0-51 |
| Hour | hh | 時 | 0-23 |
| Minute | mi, n | 分 | 0-59 |
| Second | ss, s | 秒 | 0-59 |
| Millisecond | ms | 毫秒 | 0-999 |
常用格式化輸出 (CONVERT)
-- 日期:YYYY-MM-DD
SELECT CONVERT(VARCHAR(10), GETDATE(), 120);
-- 時間:HH:MI:SS
SELECT CONVERT(VARCHAR(8), GETDATE(), 114);
-- 完整:YYYY-MM-DD HH:MI:SS
SELECT CONVERT(VARCHAR(19), GETDATE(), 120);
-- 中文格式:2024年01月15日
SELECT DATENAME(year, GETDATE()) + '年' +
RIGHT('0' + DATENAME(month, GETDATE()), 2) + '月' +
RIGHT('0' + DATENAME(day, GETDATE()), 2) + '日';
實務常用片段
本月第 1 天 / 最後 1 天
-- 月初
SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0);
-- 月底
SELECT DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0));
本週一 / 週日
-- 週一 (SET DATEFIRST 1 時)
SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0);
-- 週日
SELECT DATEADD(day, 6, DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0));
年齡計算
DECLARE @BirthDate DATE = '1990-05-20';
SELECT DATEDIFF(year, @BirthDate, GETDATE()) -
CASE WHEN DATEADD(year, DATEDIFF(year, @BirthDate, GETDATE()), @BirthDate) > GETDATE() THEN 1 ELSE 0 END;
工作日計算(排除週末)
CREATE FUNCTION dbo.fn_WorkDays(@Start DATE, @End DATE)
RETURNS INT AS BEGIN
DECLARE @Days INT = DATEDIFF(day, @Start, @End) + 1;
DECLARE @Weeks INT = @Days / 7;
DECLARE @Remain INT = @Days % 7;
DECLARE @StartDow INT = DATEPART(weekday, @Start);
RETURN @Weeks * 5 +
CASE WHEN @StartDow + @Remain - 1 <= 5 THEN @Remain
WHEN @StartDow <= 5 THEN 6 - @StartDow
ELSE 0 END;
END;
版本差異提醒
- SQL Server 2008+ 新增
DATE, TIME, DATETIME2, DATETIMEOFFSET 型別,精度更高、儲存更小。
EOMONTH() (2012+) 直接取得月底日期。
DATEFROMPARTS() (2012+) 組合日期更直觀。
結語
熟練掌握日期時間函數與 Interval 參數,能大幅簡化商業邏輯中的時間運算,減少 Bug 產生。建議收藏對照表,實務中隨查隨用。