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

Oracle 日期函數核心用法:SYSDATE、ADD_MONTHS、LAST_DAY、MONTHS_BETWEEN

     編輯:Oracle 資料庫基礎

核心函數速查

函數語法說明範例
SYSDATE-伺服器當前日期時間SELECT SYSDATE FROM dual
TRUNC(date)TRUNC(dt [,fmt])截斷時間部分(歸零至日)TRUNC(SYSDATE)
ADD_MONTHSADD_MONTHS(dt, n)加減 n 個月,自動處理月末邊界ADD_MONTHS('2024-01-31', 1) → 2024-02-29
LAST_DAYLAST_DAY(dt)回傳該月最後一天LAST_DAY('2024-02-15') → 2024-02-29
MONTHS_BETWEENMONTHS_BETWEEN(dt1, dt2)兩日期相差月數(含小數)MONTHS_BETWEEN('2024-12-31','2024-01-01') → 11.97
NEXT_DAYNEXT_DAY(dt, '星期')下一個指定週幾的日期NEXT_DAY(SYSDATE, 'FRIDAY')
ROUND(date)ROUND(dt [,fmt])日期四捨五入(時≥12 進位)ROUND(SYSDATE, 'MM')

實戰場景範例

1. 避免時間部分干擾日期比對

-- 錯誤:若 p_date 含時間,不會匹配
WHERE p_date = '2024-01-15'

-- 正確:截斷時間
WHERE TRUNC(p_date) = DATE '2024-01-15'

2. 計算員工任職月數

SELECT ename, hiredate,
       TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)) AS months_worked
FROM emp;

3. 取得本月第一天、最後一天

SELECT TRUNC(SYSDATE, 'MM') AS first_day,
       LAST_DAY(SYSDATE)     AS last_day
FROM dual;

4. 產生未來 12 個月首日清單(報表維度)

SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), LEVEL-1) AS month_start
FROM dual
CONNECT BY LEVEL <= 12;

5. 計算下一個發薪日(每月 25 號)

SELECT CASE
         WHEN TO_CHAR(SYSDATE, 'DD') <= '25'
         THEN TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM') || '-25', 'YYYY-MM-DD')
         ELSE ADD_MONTHS(TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM') || '-25', 'YYYY-MM-DD'), 1)
       END AS next_payday
FROM dual;

日期運算小技巧

  • DATE + NUMBER:加天數(SYSDATE + 7 = 一週後)。
  • DATE - DATE:相差天數(含小數)。
  • INTERVAL 語法(10g+):
    SYSDATE + INTERVAL '7' DAY、SYSDATE - INTERVAL '3' MONTH、SYSDATE + INTERVAL '2 12:30' DAY TO MINUTE。

常見陷阱

  • ADD_MONTHS 在月末會自動調整至目標月最後一天(1/31 + 1月 → 2/28 或 2/29),不可假設日數不變。
  • MONTHS_BETWEEN 回傳數值可能為負(第一參數較早),需自行取絕對值。
  • 隱含轉換風險:WHERE dt = '2024-01-15' 依賴 NLS_DATE_FORMAT,建議用 ANSI 日期常值 DATE '2024-01-15'。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved