Oracle 日期處理核心在於 TO_DATE(字串→日期)與 TO_CHAR(日期→字串)雙向轉換。本文整理格式元素、常用範例、NLS 語言設定、區間查詢陷阱、數字轉文字、月份差異計算、NEXT_DAY 用法等實務知識。
TO_DATE('字串', '格式') -- 字串轉日期
TO_CHAR(日期, '格式') -- 日期轉字串
| 元素 | 說明 | 範例 |
|---|---|---|
| YYYY / YY | 4 位 / 2 位年份 | 2024 / 24 |
| MM / MON / MONTH | 月份編號 / 縮寫 / 全名 | 03 / MAR / MARCH |
| DD / DDD | 月內第幾天 / 年內第幾天 | 15 / 256 |
| DAY / DY / D | 星期全名 / 縮寫 / 數字(1-7) | FRIDAY / FRI / 6 |
| HH24 / HH12 | 24 小時制 / 12 小時制 | 15 / 03 |
| MI / SS / SSSS | 分 / 秒 / 午夜起秒數 | 30 / 45 / 54000 |
-- 當前時間格式化
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- 2024-03-15 14:30:45
-- 字串轉日期(含時分秒)
SELECT TO_DATE('2024-03-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- 求某天星期
SELECT TO_CHAR(TO_DATE('2024-03-15','YYYY-MM-DD'), 'DAY') FROM dual; -- FRIDAY
SELECT TO_CHAR(TO_DATE('2024-03-15','YYYY-MM-DD'), 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN') FROM dual; -- FRIDAY
-- 設定 Session 語言
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
BETWEEN '2024-01-01' AND '2024-01-31' 不含 1/31 當天 00:00 之後的資料。精確查詢請用 TO_CHAR 或 TRUNC 處理。UNION SELECT 1, TO_DATE(NULL) FROM dual,不可直接用 NULL。SELECT TO_CHAR(TO_DATE(222,'J'),'JSP') FROM dual → TWO HUNDRED TWENTY-TWO。FLOOR(SYSDATE - TO_DATE('20240101','YYYYMMDD'))。MONTHS_BETWEEN(date1, date2),結果含小數(如 1.032 表示 1 個月零 1 天)。NEXT_DAY(date, 'MONDAY') -- 或 'MON', 或 2 (1=Sunday)
-- 回傳 date 之後第一個星期一的日期