Oracle 以數值內部儲存日期 (世紀、年、月、日、時、分、秒),預設顯示格式為 DD-MON-RR。理解內部表示與格式模型,是處理日期資料的基礎。本文整理核心觀念與實用範例。
RR 格式允許輸入兩位數年份,自動推斷世紀 (1950-2049 規則)。SYSDATE 回傳資料庫伺服器當前日期時間。| 運算 | 語法 | 結果型態 | 範例 |
|---|---|---|---|
| 日期 - 日期 | date1 - date2 | 數值 (天數,含小數) | SYSDATE - HIRE_DATE |
| 日期 + 數值 | date + n | 日期 | SYSDATE + 7 (一週後) |
| 日期 - 數值 | date - n | 日期 | SYSDATE - 30 (30天前) |
| 日期 + 間隔 | date + INTERVAL 'n' DAY | 日期 | ANSI 標準寫法 |
SELECT last_name, hire_date
FROM employees
WHERE hire_date < '01-FEB-88'; -- 字串依 NLS_DATE_FORMAT 隱含轉換
建議:明確使用 TO_DATE 或 DATE '1988-02-01' (ANSI 字面值) 避免格式歧義。
SELECT last_name, (SYSDATE - hire_date) / 7 AS weeks
FROM employees
WHERE department_id = 90;
結果為數值,含小數 (如 123.4 週)。若需整數可用 TRUNC 或 FLOOR。
| 函數 | 用途 | 範例 |
|---|---|---|
SYSDATE | 目前日期時間 | SELECT SYSDATE FROM DUAL; |
ADD_MONTHS(d, n) | 加減月份 | ADD_MONTHS(SYSDATE, 3) |
MONTHS_BETWEEN(d1, d2) | 兩日期月差 | MONTHS_BETWEEN(SYSDATE, hire_date) |
LAST_DAY(d) | 該月最後一天 | LAST_DAY(SYSDATE) |
NEXT_DAY(d, 'DAY') | 下一個指定週幾 | NEXT_DAY(SYSDATE, 'FRIDAY') |
TRUNC(d, 'fmt') | 截斷到指定單位 | TRUNC(SYSDATE, 'MM') 月初 |
ROUND(d, 'fmt') | 四捨五入到單位 | ROUND(SYSDATE, 'YYYY') 年中 |
TO_CHAR(d, 'fmt') | 日期轉字串 | TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') |
TO_DATE(s, 'fmt') | 字串轉日期 | TO_DATE('2024-01-15', 'YYYY-MM-DD') |
EXTRACT(YEAR/MONTH/DAY FROM d) | 擷取元件 (ANSI) | EXTRACT(MONTH FROM SYSDATE) |
YYYY 四位數年 MM 月(01-12) MON 月縮寫(JAN-DEC)
DD 日(01-31) DY 週幾縮寫 DAY 週幾全名
HH24 24制時 MI 分 SS 秒
AM/PM 上午/下午標識
TO_DATE 或 ANSI DATE 'YYYY-MM-DD'。TIMESTAMP WITH TIME ZONE 或 TIMESTAMP WITH LOCAL TIME ZONE。