日期運算與類型轉換是報表、ETL、業務邏輯的核心。本文系統講解 MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY、LAST_DAY、ROUND/TRUNC(date) 五大日期函數,以及 TO_CHAR/TO_DATE/TO_NUMBER 轉換三劍客與 NVL 空值處理,案例驅動,即學即用。
| 函數 | 語法/示例 | 結果/說明 |
|---|---|---|
| MONTHS_BETWEEN | MONTHS_BETWEEN('01-SEP-95','11-JAN-94') | 19.677...(含小數,d1 > d2 為正) |
| ADD_MONTHS | ADD_MONTHS('11-JAN-94', 6) | '11-JUL-94'(自動處理月末) |
| NEXT_DAY | NEXT_DAY('01-SEP-95', 'FRIDAY') | '08-SEP-95'(下一個周五) |
| LAST_DAY | LAST_DAY('01-SEP-95') | '30-SEP-95'(該月最後一天) |
| ROUND(date,'MONTH') | ROUND('25-JUL-95','MONTH') | '01-AUG-95'(月中後進位下月 1 號) |
| ROUND(date,'YEAR') | ROUND('25-JUL-95','YEAR') | '01-JAN-96'(年中後進位次年 1 月 1 號) |
| TRUNC(date,'MONTH') | TRUNC('25-JUL-95','MONTH') | '01-JUL-95'(直接截斷到月首) |
| TRUNC(date,'YEAR') | TRUNC('25-JUL-95','YEAR') | '01-JAN-95'(直接截斷到年首) |
YYYY 四位年 YEAR 年度拼寫
MM 兩位月 MONTH 月份全拼
DY 星期縮寫 DAY 星期全拼
SELECT ename, hiredate,
TO_CHAR(hiredate, 'YYYY-MM-DD') AS hire_dt,
TO_CHAR(sal, 'L99,999.99') AS formatted_sal
FROM scott.emp;
-- L 為本地貨幣符號,$/¥/€ 視 NLS_TERRITORY 而定
INSERT INTO scott.emp(empno, ename, hiredate)
VALUES (9004, 'dtConvert', TO_DATE('1982-05-04', 'YYYY-MM-DD'));
-- 結果顯示:04-5月-82(受 NLS_DATE_FORMAT 影響)
NVL(comm, 0) -- 數值
NVL(hiredate, DATE '1997-01-01') -- 日期(ANSI 日期字面量)
NVL(job, 'No Job Yet') -- 字符
-- 適用類型:DATE, CHAR, VARCHAR2, NUMBER 等
SELECT ename, hiredate,
ADD_MONTHS(hireday, 12 * FLOOR(MONTHS_BETWEEN(SYSDATE, hiredate)/12)) AS next_anniversary
FROM emp
WHERE ADD_MONTHS(hireday, 12 * FLOOR(MONTHS_BETWEEN(SYSDATE, hiredate)/12))
BETWEEN SYSDATE AND SYSDATE + 7; -- 未來 7 天內過周年