Fun_LastDayOfMonthp_ym CHAR(6) 格式 YYYYMM (如 202402)DATE 該月最後一天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
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 或需特殊格式輸出時才自行實作。