2017-07-05 81 views
-1

我有一些月/年數據存儲在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) 
+0

1)您是否將格式字符串傳遞給'TO_DATE'? 2)編寫一些代碼,每次測試一個值,並捕獲ORA-01841,打印導致問題的值。 –

+0

你可以發佈你用來檢查月份,第三個字符等的代碼嗎?你採取的方法是正確的,如果查詢也是正確的,那麼你應該抓到了不好的數據。所以讓我們看看這些查詢。 – mathguy

+0

以及你如何轉換? – miracle173

回答

1

發現了我的問題 - 我的其他部分WHERE子句縮小了我的工作重點,以具有良好的數據行。但是,不能保證WHERE子句中的哪些項目的順序是第一次,第二次等等。因此,我必須查看錶中'field'的所有數據。你不能只註釋掉WHERE子句給你帶來麻煩。我發現了一些field ='0/0'的行,這是我數據問題的根源。

+0

我開始懷疑它是否在做數學2015/10,然後試圖將201.5投射到日期... – xQbert

+0

如果您想查找不良數據並獲得每個無效字符串的確切問題,可以使用CASE表達式,其**是按順序評估的。如果您需要幫助,請告訴我。 – mathguy