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

Oracle TO_DATE 格式模型不符導致錯誤的完整解析與避坑指南

     編輯:Oracle 資料庫基礎

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
時HH2424 小時制00~23
HH12 / HH12 小時制01~12
AM / PM上/下午標記AM / PM
分/秒MI / SS兩位數字00~59
小數秒FF[1..9]微秒~奈秒.123456
季度Q1~41

經典錯誤案例與修正

案例 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')

案例 2:分隔符號不符

TO_DATE('2023/12/25', 'YYYY-MM-DD')  -- 錯誤,分隔符 / vs -
TO_DATE('2023/12/25', 'YYYY/MM/DD')  -- 正確

案例 3:語言環境導致月份名稱不符

-- 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')

除錯三步驟

  1. 拆解對比: 將輸入字串與格式模型逐字元對齊,檢查長度、分隔符、大小寫。
  2. 使用 FX 修飾詞: TO_DATE(str, 'FXYYYY-MM-DD') 強制完全比對,若多一空白即報錯,利於開發期發現問題。
  3. 檢查 Session 參數: 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 錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved