TO_DATE(string, fmt) 與 TO_CHAR(date, fmt) 是 Oracle 日期處理的雙核心函式。最常見錯誤是「格式模型 fmt 與輸入字串不匹配」,導致 ORA-018xx 系列錯誤。本文系統整理格式元素、實戰錯誤案例、除錯技巧與最佳實務。
| 類別 | 元素 | 說明 | 範例輸出 |
|---|---|---|---|
| 年 | YYYY | 四位年份 | 2024 |
| YYY / YY / Y | 後三/二/一位 | 024 / 24 / 4 | |
| RRRR | 跨世紀安全寫法 | 同 YYYY,但兩位年自動推斷世紀 | |
| Y,YYY | 含千分位逗號 | 2,024 | |
| 月 | MM | 兩位數字 | 01~12 |
| MON | 縮寫名稱 | JAN / 1月 | |
| MONTH | 全名 | JANUARY / 一月 | |
| 日 | DD | 月內第幾天 | 01~31 |
| DDD | 年內第幾天 | 001~366 | |
| DY / DAY | 星期縮寫/全名 | FRI / FRIDAY | |
| W / WW | 月內/年內週數 | 1~5 / 1~53 | |
| 時 | HH24 | 24 小時制 | 00~23 |
| HH12 / HH | 12 小時制 | 01~12 | |
| AM / PM | 上/下午標記 | AM / PM | |
| 分/秒 | MI / SS | 兩位數字 | 00~59 |
| 小數秒 | FF[1..9] | 微秒~奈秒 | .123456 |
| 季度 | Q | 1~4 | 1 |
-- 錯誤:輸入 13 點卻用 HH12
TO_DATE('2023-12-25 13:25:59', 'YYYY-MM-DD HH:MI:SS')
-- ORA-01847: day of month must be between 1 and last day of month (實際誤判為小時超界)
-- 正確:改用 HH24
TO_DATE('2023-12-25 13:25:59', 'YYYY-MM-DD HH24:MI:SS')
TO_DATE('2023/12/25', 'YYYY-MM-DD') -- 錯誤,分隔符 / vs -
TO_DATE('2023/12/25', 'YYYY/MM/DD') -- 正確
-- Session NLS_DATE_LANGUAGE = AMERICAN
TO_DATE('25-DEC-2023', 'DD-MON-YYYY') -- 正常
-- 若 Session 為繁體中文,需 TO_DATE('25-12月-2023', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')
TO_DATE(str, 'FXYYYY-MM-DD') 強制完全比對,若多一空白即報錯,利於開發期發現問題。SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER LIKE '%DATE%'; 確認 NLS_DATE_FORMAT、NLS_DATE_LANGUAGE 是否干擾隱含轉換。NLS_DATE_FORMAT 隱含轉換。TIMESTAMP WITH TIME ZONE + TO_TIMESTAMP_TZ,避免 DATE 型態無時區資訊的缺陷。掌握格式模型細節,善用 FX 與顯式轉換,即可杜絕 90% 以上的 TO_DATE 錯誤。