首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 自定義函數:計算指定年月最後一天 (含閏年判斷)

     編輯:MySQL 資料庫相關知識

函數規格

  • 名稱:Fun_LastDayOfMonth
  • 輸入:p_ym CHAR(6) 格式 YYYYMM (如 202402)
  • 輸出:DATE 該月最後一天
  • 支援:閏年規則(400 整除或 4 整除但非 100 整除)

MySQL 8.0+ 標準寫法

CREATE FUNCTION Fun_LastDayOfMonth(p_ym CHAR(6))
RETURNS DATE
DETERMINISTIC
NO SQL
BEGIN
    DECLARE v_year  INT;
    DECLARE v_month INT;
    DECLARE v_last  DATE;

    SET v_year  = CAST(LEFT(p_ym, 4) AS UNSIGNED);
    SET v_month = CAST(RIGHT(p_ym, 2) AS UNSIGNED);

    -- 下月 1 日減 1 天 = 本月最後一天
    SET v_last = DATE_SUB(
        STR_TO_DATE(CONCAT(v_year, '-', LPAD(v_month % 12 + 1, 2, '0'), '-01'), '%Y-%m-%d'),
        INTERVAL 1 DAY
    );

    RETURN v_last;
END;

驗證測試

SELECT Fun_LastDayOfMonth('202402'); -- 2024-02-29 (閏年)
SELECT Fun_LastDayOfMonth('202302'); -- 2023-02-28
SELECT Fun_LastDayOfMonth('202404'); -- 2024-04-30
SELECT Fun_LastDayOfMonth('202412'); -- 2024-12-31

進階:直接回傳 CHAR(10) 格式

CREATE FUNCTION Fun_LastDayOfMonth_Str(p_ym CHAR(6))
RETURNS CHAR(10)
DETERMINISTIC
NO SQL
RETURN DATE_FORMAT(Fun_LastDayOfMonth(p_ym), '%Y-%m-%d');

效能提示

  • 標記 DETERMINISTIC + NO SQL 讓優化器快取結果。
  • 避免逐行呼叫於百萬列查詢;改用 LAST_DAY() 內建函數(MySQL 5.0+)直接在 SQL 中計算:
SELECT LAST_DAY(STR_TO_DATE(CONCAT('202402','01'), '%Y%m%d'));

內建函數永遠優於自定義函數,僅在舊版本無 LAST_DAY 或需特殊格式輸出時才自行實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved