報表與 ETL 常需計算本月/上月的起迄日期,封裝為可重用片段提升開發效率。
DECLARE @startdate DATETIME, @enddate DATETIME; SELECT @startdate = DATEADD(DAY, -DATEPART(DAY, GETDATE()) + 1, GETDATE()); SELECT @enddate = DATEADD(DAY, -DATEPART(DAY, GETDATE()), DATEADD(MONTH, 1, GETDATE())); -- 結果格式化:SELECT CONVERT(VARCHAR(10), @startdate, 23) -- yyyy-mm-dd
DECLARE @startdate DATETIME, @enddate DATETIME; SELECT @startdate = DATEADD(MONTH, -1, DATEADD(DAY, -DATEPART(DAY, GETDATE()) + 1, GETDATE())); SELECT @enddate = DATEADD(MONTH, -1, DATEADD(DAY, -DATEPART(DAY, GETDATE()) + 1, DATEADD(MONTH, 1, GETDATE())));
DATEPART(DAY, GETDATE()) 取得今天是幾號。-DAY + 1 退回到本月 1 號 00:00:00。DATEADD(MONTH, 1, ...) 往前推一個月得到下月 1 號,再 -1 DAY 得到本月最後一天 23:59:59。DATEADD(MONTH, -1) 位移。建議封裝為內嵌表值函數 fn_GetMonthRange(@offset INT),傳入 0 表本月、-1 表上月,回傳 StartDate/EndDate 兩欄,專案統一呼叫。