我有一些月/年數據存儲在VARCHAR2字段中,格式爲MM/YYYY。 當我嘗試將其轉換爲與WHERE子句中的其他日期進行比較的日期時,我得到「ORA-01841:(full)year必須介於-4713和+9999之間,而不是0」錯誤。與TO_DATE函數有關的Oracle錯誤?
我檢查了空值,沒有。我用最小和最大函數檢查了兩個字符月份,它們返回min ='01'和max ='12'。我檢查了分隔符 - 沒有位置3不是'/'的行。字段的長度總是7.最後,使用來自年份位置的4個字符,我確定min ='2010'和max ='3020'。我還檢查了一年中每個字符<'0'和>'9',沒有返回行。當我在WHERE子句中運行沒有to_date的SQL,但將它作爲select列保留時,它不會拋出錯誤。
如何在這種情況下找到不良數據?我很難過。
場空校驗(在where子句):
and field is null ; result is 0 rows
檢查字段的長度(以where子句):
and length(field) != 7 ; result is 0 rows
月檢查(如選擇列)
min(substr(field, 1, 2)) ; result is '01' (string)
max(substr(field, 1, 2)) ; result is '12' (string)
分隔符檢查(在where子句中)
and substr(field, 3, 1) != '/' ; result is 0 rows
年度檢查(如選擇列)
min(substr(field, 4, 4)) ; result is '2010' (string)
max(substr(field, 4, 4)) ; result is '3020' (string)
1)您是否將格式字符串傳遞給'TO_DATE'? 2)編寫一些代碼,每次測試一個值,並捕獲ORA-01841,打印導致問題的值。 –
你可以發佈你用來檢查月份,第三個字符等的代碼嗎?你採取的方法是正確的,如果查詢也是正確的,那麼你應該抓到了不好的數據。所以讓我們看看這些查詢。 – mathguy
以及你如何轉換? – miracle173