輸入年、月(整數或字串),回傳該月總天數。核心邏輯:取下月 1 號,減 1 天,取 DAY。
DECLARE @Year INT = 2024, @Month INT = 2; -- 測試 2024 年 2 月(閏年)
DECLARE @dt VARCHAR(10), @iDays INT;
SET @dt = CAST(@Year AS VARCHAR(4)) + '-' + RIGHT('0' + CAST(@Month AS VARCHAR(2)), 2) + '-01';
-- @dt = '2024-02-01'
SELECT @iDays = DAY(DATEADD(DAY, -1, DATEADD(MONTH, 1, CAST(@dt AS DATETIME))));
-- DATEADD(MONTH,1,@dt) → 2024-03-01
-- DATEADD(DAY,-1,...) → 2024-02-29
-- DAY(...) → 29
PRINT @iDays; -- 輸出 29
CREATE FUNCTION dbo.fn_DaysInMonth (@Year INT, @Month INT)
RETURNS INT
AS
BEGIN
DECLARE @FirstOfNextMonth DATETIME;
SET @FirstOfNextMonth = DATEADD(MONTH, 1, DATEFROMPARTS(@Year, @Month, 1));
RETURN DAY(DATEADD(DAY, -1, @FirstOfNextMonth));
END;
GO
-- 使用
SELECT dbo.fn_DaysInMonth(2024,2); -- 29
SELECT dbo.fn_DaysInMonth(2023,2); -- 28
DATEFROMPARTS (SQL 2012+):安全構造日期,避免字串格式問題。DATEADD(MONTH,1,...):自動處理跨年(12 月 → 翌年 1 月)。DAY(...):擷取日期部分,即該月最後一天 = 總天數。