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

Oracle 日期時間處理完全手冊:格式轉換、運算、時區、間隔與實用函數大全

     編輯:Oracle 資料庫基礎

核心格式模型

元素代碼示例
日DD / DY / DAY / DDSPTH12 / FRI / FRIDAY / TWELFTH
月MM / MON / MONTH03 / MAR / MARCH
年YY / YYYY98 / 1998
時(24h)HH2423
時(12h)HH11
分/秒MI / SS59 / 59

常用轉換與查詢

  • 字符↔日期: TO_DATE('2002-08-26','YYYY-MM-DD')、TO_CHAR(date,'YYYY-MM-DD HH24:MI:SS')
  • 數字轉詞: TO_CHAR(TO_DATE(222,'J'),'JSP') → Two Hundred Twenty-Two
  • 星期幾: TO_CHAR(date,'DAY') 或 TO_CHAR(date,'DAY','NLS_DATE_LANGUAGE=AMERICAN')
  • 會話級語言: ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'
  • 日期差天數: FLOOR(SYSDATE - TO_DATE('20020405','YYYYMMDD'))
  • NULL 日期處理: TO_DATE(NULL)(不可直接用 NULL)
  • BETWEEN 陷阱: 日期含時間時,BETWEEN '2001-12-01' AND '2001-12-31' 會漏掉 31 號中午後與 1 號中午前 → 建議用 TO_CHAR 截取日期部分比較。

進階運算與函數

1. 工作日計算(排除週末)

SELECT COUNT(*)
FROM (
    SELECT ROWNUM-1 rnum FROM all_objects
    WHERE ROWNUM <= TO_DATE('2002-02-28','YYYY-MM-DD') - TO_DATE('2002-02-01','YYYY-MM-DD') + 1
)
WHERE TO_CHAR(TO_DATE('2002-02-01','YYYY-MM-DD') + rnum - 1, 'D') NOT IN ('1','7');

2. 月份差:MONTHS_BETWEEN

跨月不滿月返回小數,如 1.032258…

3. 下一個指定星期幾:NEXT_DAY(date, 'FRIDAY' / 6)

參數可為全寫/縮寫/數字(1=周日)。

4. 時分秒毫秒拆解

SELECT
    TRUNC(A*24) AS Hours,
    TRUNC(A*24*60 - 60*TRUNC(A*24)) AS Minutes,
    TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) AS Seconds,
    TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) AS MSeconds
FROM (SELECT SYSDATE - TRUNC(SYSDATE) A FROM dual);

5. 年月日拆解(處理月長不一)

SELECT
    YEARS, MONTHS,
    ABS(TRUNC(NEWER_DATE - ADD_MONTHS(OLDER_DATE, YEARS*12 + MONTHS))) DAYS
FROM (
    SELECT
        TRUNC(MONTHS_BETWEEN(NEWER_DATE, OLDER_DATE)/12) YEARS,
        MOD(TRUNC(MONTHS_BETWEEN(NEWER_DATE, OLDER_DATE)), 12) MONTHS,
        NEWER_DATE, OLDER_DATE
    FROM (SELECT HIREDATE OLDER_DATE, ADD_MONTHS(HIREDATE, ROWNUM)+ROWNUM NEWER_DATE FROM EMP)
);

6. 月首/月末/閏年

  • 上月首日:TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE)+1, -2), 'YYYYMMDD')
  • 本年天數:ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),12) - TRUNC(SYSDATE,'YEAR')
  • 閏年判斷:TO_CHAR(LAST_DAY(TO_DATE('02'||:year,'MMYYYY')),'DD') = 29 為閏年。

7. RRRR vs YYYY

RRRR 兩位年自動補全為當前世紀(99→1999, 01→2001);YYYY 直取(99→0099)。

8. 時區轉換:NEW_TIME(sysdate, 'GMT', 'EST')

9. 固定間隔對齊(如 5 分鐘桶)

SELECT TO_DATE(FLOOR(TO_CHAR(SYSDATE,'SSSSS')/300)*300,'SSSSS') FROM dual;

10. 年第幾天:TO_CHAR(SYSDATE,'DDD')

新特性函數速查(9i/10g+)

日期運算三大鐵律

  1. 單位以「天」為基準。
  2. 需分秒精度時,按時間進制換算(×24×60×60)。
  3. 換算時務必加括號控制優先級,否則結果錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數用途
CURRENT_DATE會話時區當前日期
CURRENT_TIMESTAMP會話時區帶時區時間戳
DBTIMEZONE數據庫時區
EXTRACT(field FROM datetime)提取年/月/日/時/分/秒
LAST_DAY(date)該月最後一天
LOCALTIMESTAMP會話時區無時區時間戳
ADD_MONTHS(date, n)加減月份