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

Oracle 取得月份天數的標準做法:LAST_DAY 與 ADD_MONTHS 組合拳

     編輯:Oracle 資料庫基礎

計算指定月份的天數是常見需求 (如利息計算、報表週期)。Oracle 提供 LAST_DAY 直接取得月份最後一天,配合 TO_CHAR(...,'DD') 即可輕鬆獲得天數。本文示範標準寫法、跨月計算、閏年自動處理,並說明為何不建議手寫 CASE WHEN 判斷閏年。

核心函數介紹

  • LAST_DAY(date):回傳該日期所在月份的最後一天 (日期型別)。
  • ADD_MONTHS(date, n):日期加減 n 個月,自動處理月末邊界 (如 1/31 + 1月 → 2/28 或 2/29)。
  • TO_CHAR(date, 'DD'):萃取日期的「日」部分。

基本用法:指定月份天數

-- 取得 2008 年 9 月天數
SELECT TO_CHAR(LAST_DAY(TO_DATE('2008-09-01', 'YYYY-MM-DD')), 'DD') AS days
FROM   DUAL;
-- 結果:30

關鍵點:輸入 TO_DATE 時建議使用月初第一天,格式掩碼 YYYY-MM-DD 清晰無誤。

進階:動態計算上個月 / 任意月份天數

-- 上個月天數 (以 2008-03-30 為基準)
SELECT TO_CHAR(
         LAST_DAY(
           ADD_MONTHS(TO_DATE('2008-03-30', 'YYYY-MM-DD'), -1)
         ),
         'DD'
       ) AS days
FROM   DUAL;
-- 結果:29 (2008 年為閏年,2 月 29 天)

驗證閏年自動處理

-- 直接看 ADD_MONTHS 計算結果
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2008-03-30', 'YYYY-MM-DD'), -1), 'YYYYMMDD')
FROM   DUAL;
-- 結果:20080229  (自動識別閏年)

常見錯誤與避坑指南

錯誤寫法問題正確寫法
TO_DATE('200809', 'YYYYMM') 直接餵給 LAST_DAY隱含轉換依賴 NLS_DATE_FORMAT,跨環境不穩定明確指定 TO_DATE('2008-09-01','YYYY-MM-DD')
自寫 CASE WHEN MOD(year,4)=0 ... 判斷閏年邏輯複雜、易漏掉 100/400 年規則信任 ADD_MONTHS + LAST_DAY 內建邏輯
使用 EXTRACT(DAY FROM LAST_DAY(...))回傳 NUMBER 需再轉字串TO_CHAR(...,'DD') 一步到位

實務範本:通用函數化

CREATE OR REPLACE FUNCTION get_month_days(p_year NUMBER, p_month NUMBER)
RETURN NUMBER IS
BEGIN
  RETURN TO_CHAR(LAST_DAY(TO_DATE(p_year||'-'||p_month||'-01','YYYY-MM-DD')), 'DD');
END;
/
-- 呼叫範例
SELECT get_month_days(2024, 2) FROM DUAL; -- 回傳 29

掌握 LAST_DAY + ADD_MONTHS 組合,即可以最簡潔、最可靠的方式解決所有月份天數計算需求,無需自行處理閏年邏輯。

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