首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

T-SQL 依年月計算該月天數(含閏年自動判斷)

     編輯:關於SqlServer

輸入年、月(整數或字串),回傳該月總天數。核心邏輯:取下月 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(...):擷取日期部分,即該月最後一天 = 總天數。

應用場景

  • 報表產生器:動態決定橫向欄位數(日曆式報表)。
  • 排程系統:計算月度工作日、薪資發放日。
  • 資料品質:驗證日期欄位 Day 元件是否超出該月上限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved