SQL Server 透過 DATEADD + DATEDIFF 組合,可精確計算各類「邊界日期」,不需拆解年月日再組合。以下提供可直接套用的標準腳本。
以基準日 0 (1900-01-01) 為起點,計算目標日期與基準日的間隔數,再加回基準日即得邊界值。
| 需求 | T-SQL 腳本 | 結果範例 (假設今日 2023-10-15) |
|---|---|---|
| 本月第一天 00:00:00 | DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) | 2023-10-01 00:00:00 |
| 本月最後一天 23:59:59.997 | DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0)) | 2023-10-31 23:59:59.997 |
| 上個月最後一天 | DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) | 2023-09-30 23:59:59.997 |
| 本月第一個週一 | DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6-DATEPART(DAY, GETDATE()), GETDATE())), 0) | 2023-10-02 |
| 本年第一天 | DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) | 2023-01-01 00:00:00 |
| 本年最後一天 | DATEADD(MS, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE())+1, 0)) | 2023-12-31 23:59:59.997 |
| 去年最後一天 | DATEADD(MS, -3, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)) | 2022-12-31 23:59:59.997 |
| 本季第一天 | DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0) | 2023-10-01 |
| 本周週一 | DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) | 2023-10-09 |
-- 本月資料
WHERE DATEPART(MONTH, theDate) = DATEPART(MONTH, GETDATE())
AND DATEPART(YEAR, theDate) = DATEPART(YEAR, GETDATE())
-- 本周資料
WHERE DATEPART(WEEK, theDate) = DATEPART(WEEK, GETDATE())
AND DATEPART(YEAR, theDate) = DATEPART(YEAR, GETDATE())
-- 本季資料
WHERE DATEPART(QUARTER, theDate) = DATEPART(QUARTER, GETDATE())
AND DATEPART(YEAR, theDate) = DATEPART(YEAR, GETDATE())
CREATE FUNCTION dbo.fn_MonthStart (@dt DATETIME) RETURNS DATETIME AS BEGIN
RETURN DATEADD(MONTH, DATEDIFF(MONTH, 0, @dt), 0);
END;
CREATE FUNCTION dbo.fn_MonthEnd (@dt DATETIME) RETURNS DATETIME AS BEGIN
RETURN DATEADD(MS, -3, DATEADD(MONTH, DATEDIFF(MONTH, 0, @dt)+1, 0));
END;
-- 使用
SELECT * FROM Orders
WHERE OrderDate BETWEEN dbo.fn_MonthStart(GETDATE()) AND dbo.fn_MonthEnd(GETDATE());
-- 當月天數
SELECT DATEDIFF(DAY, GETDATE(), DATEADD(MONTH, 1, GETDATE()));
-- 星期名稱
SELECT DATENAME(WEEKDAY, GETDATE()); -- 如 'Sunday'