系統日期設定不正確導致的ORA-01839錯誤
早上收到開發人員發來的郵件,說在一個測試環境中SQL執行報錯,但相同的SQL在另一個測試環境中卻執行經常,叫我幫忙分析一下原因。報錯的SQL為:
SQL> select to_date(substr(cvalidate, 6, 10), 'MM-DD') from lcpol where polno='210010000123931';
select to_date(substr(cvalidate, 6, 10), 'MM-DD') from lcpol where polno='210010000123931';
*
ERROR at line 1:
ORA-01839: date not valid for month specified
一看錯誤資訊是ORA-01839: date not valid for month specified。首先想到可能是資料有問題導致在使用TO_DATE報錯。不管怎樣先去求證下是不是真的存在該錯誤。首先連線上說執行報錯的庫,執行SQL,果然如開發人員所說報錯。接著連線上說執行正常的庫,執行SQL,果然Oracle很友好的返回了結果。既然錯誤事實存在,那就要去找出導致錯誤的原因了。
按照對錯誤的第一反應,先去比對兩邊的資料是否一樣。比對結果有點令人失望,兩邊的資料完全一模一樣。難道是SQL本身存在問題?仔細分析下SQL,應該沒錯啊,雖然使用'MM-DD'格式化的寫法不怎麼好,但也應該不至於導致執行錯誤啊,況且在另外的庫上是執行正確的。那問題到底處在哪呢?難道是兩庫的日期引數設定不一樣?檢視了一下,兩個資料庫的NLS_CHARACTERSET,
NLS_NCHAR_CHARACTERSET, NLS_DATE_LANGUAGE, NLS_DATE_FORMAT設定也是一樣的。好吧,看來問題應該不在資料上。
再回頭來看一下,在條件polno='210010000123931'下的cvalidate是個什麼值呢?
SQL> select cvalidate from lcpol where polno='210010000123931'; CVALIDATE ---------- 2012-02-29
看來該值確實也比較特殊,4年才會出現一次。但是特殊歸特殊,也不應該報錯了。想到如果直接用該值會怎樣?嗯,那就試試看:
SQL>select to_date(substr('2012-02-29', 6, 10), 'MM-DD') from dual;
ERROR
-----------------------
ERROR at line 1:
ORA-01839: date not valid for month specified
SQL> select to_date(substr('2012-02-29', 6, 10), 'MM-DD') from dual;
TO_DATE(SU
----------
2012-02-29
測試結果還是一樣。正一籌莫展之際,突然注意到雖然使用'MM-DD'來格式化日期,但是結果中仍然還有年的資訊!想到當前的NLS_DATE_FORMAT為'YYYY-MM-DD',猜測Oracle會使用當前系統的日期來附加年的資訊。難道是那臺執行錯誤的庫的系統日期不正確,馬上檢視一下,果然,系統日期是2013年!
$ date
Fri Mar 1 18:45:13 CST 2013
馬上聯絡系統管理小組幫忙修正系統日期。在系統日期修改正確後,SQL執行正常,至此問題解決。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13885898/viewspace-1651579/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 統計資訊不正確導致執行計劃的錯誤選擇
- /etc/fstab的錯誤設定導致系統啟動失敗
- iOS使用者注意了:日期設定錯誤可導致裝置“變磚”iOS
- PostgreSQL DBA(29) - Backup&Recovery#2(日期格式導致的錯誤)SQL
- 關於Apache錯誤頁面導致版本顯示的設定Apache
- FAL_SERVER設定錯誤導致SWITCHOVER切換HANG住Server
- 記錄下解決自定義 Feign 呼叫,響應content-type 格式不正確導致的解析錯誤
- 執行計劃錯誤導致系統負載高負載
- 等於NULL的查詢條件導致查詢結果不正確Null
- 資料庫報ORA-01839的錯誤資料庫
- 使用錯誤的作業系統使用者exp資料導致ORA-15186錯誤作業系統
- impdp時parallel=4導致的錯誤Parallel
- ORACLE_HOME設定錯誤導致本地sqlplus無法登陸OracleSQL
- 多餘索引導致explain錯誤索引AI
- 環境變數設定錯誤導致sqlplus 連線不上oracle變數SQLOracle
- 又一例SPFILE設定錯誤導致資料庫無法啟動資料庫
- Linux 設定錯誤的DNS 伺服器導致網路傳輸慢的問題LinuxDNS伺服器
- SQL未明確定義列錯誤SQL
- Oracle備份時系統負載過高導致ORA-3136錯誤和AIX系統的3D32B80D錯誤Oracle負載AI3D
- merge語句導致的ORA錯誤分析
- 正確設定asp.net網站的404錯誤頁面ASP.NET網站
- Lombok 的@ToString導致的Maven編譯錯誤LombokMaven編譯
- win10系統怎麼設定長日期_win10時間日期設定為長日期的步驟Win10
- win10系統引導怎麼設定_win10設定系統引導的方法Win10
- Greenplummax_prepared_transactions設定不正確時的症狀-toomanyclientsalreadyOOMclient
- 誤升級GLIBC導致系統崩潰之後
- 修復svn hook導致的字符集錯誤Hook
- sys密碼修改導致的RMAN-00571錯誤密碼
- goldengate命令輸入錯誤導致的血案2Go
- compatible相容引數不正確導致DG物理備庫不能應用日誌應用日誌
- SQLite 由於 mscoree.dll 損壞導致 BadImageFormatException 試圖載入格式不正確的程式SQLiteORMException
- mysql怎麼設定密碼都不正確的一個解決方法MySql密碼
- win10系統設定登入錯誤次數及鎖定賬戶的方法Win10
- 升級Xcode10導致的編譯錯誤XCode編譯
- GoldenGate MSSQL Oracle的主鍵問題導致的錯誤GoSQLOracle
- [轉]解決系統CPU個數識別不正確的問題
- win10系統提示dcom遇到錯誤1068導致當機的解決步驟Win10
- 如何解決WAS的JAVA虛擬機器引數設定錯誤,導致控制檯無法啟動的問題Java虛擬機