2015-09-03 32 views
0

我在查詢Oracle 11.2實例來構建一個小型數據集市,其中包括提取出生日期和人員死亡日期。在Oracle 11g數據庫中檢測無效日期(ORA-01847)

不幸的是,由於ORA-01847(月份的天數必須在1月份到最後一天之間),INSERT查詢(從SELECT獲取數據)失敗。

找到我劣棗我第一次做:

SELECT extract(day FROM SOME_DT_TM), 
     extract(month FROM SOME_DT_TM), 
     COUNT(*) 
    FROM PERSON 
GROUP BY extract(day FROM SOME_DT_TM), extract(month FROM SOME_DT_TM) 
ORDER BY COUNT(*) DESC; 

它給了我367行,一爲今年的每一天,包括NULL和日至29日(閏年)。對於其他日期列也是如此,因此從SELECT的角度來看,數據看起來很好。

但是,如果我把我的插入記錄了

create table registry_new_dates 
       (some_dob date, some_death_date date); 
exec dbms_errlog.create_error_log('SOME_NEW_DATES'); 

然後運行我的長插入查詢:

SELECT some_dob,some_death_date,ora_err_mesg$ FROM ERR$_SOME_NEW_DATES; 

我得到以下奇怪的結果(如圖第3行),這讓我認爲郵政編碼已被插入,而不是第二列的日期。

31-DEC-25 35244 "ORA-01847: day of month must be between 1 and last day of month" 
13-DEC-33 35244-3402 "ORA-01847: day of month must be between 1 and last day of month" 
23-JUN-58 35235 "ORA-01847: day of month must be between 1 and last day of month" 

我的問題是 - 我如何檢測這些壞行(有11顯然是)與SQL語句,所以我可以修復或刪除它們。將它們修復在始發表中不是一個選項(沒有寫權限)。我嘗試使用這樣的查詢:

SELECT DECEASED_DT_TM 
    FROM WH_CLN_PERSON 
WHERE DECEASED_DT_TM LIKE '35%' 
    AND rownum<3; 

但它沒有找到有問題的行。

+1

deceased_dt_tm的數據類型是什麼? –

+1

第一種方法是將日期和主人密鑰一起插入臨時表中。你仍然應該得到那個插入的錯誤,但是主鍵會讓你檢查看起來不好的行,看看發生了什麼。一旦你知道他們壞的方式,你可以尋找一種方法來修復或過濾它們。 – Zastai

+0

DECEASED_DT_TM是日期 – ozborn

回答

0

不確定您是否仍在積極研究此問題(或者您是否已經有答案)。

要找到壞的數據行,你能不能代替選擇DOB 死亡的日期,並表達DOB方面的WHERE子句 - 像這樣: ... WHERE some_dob = TO_DATE ('31-DEC-25') ?找到這些行後,可能需要對其中一個或兩個行執行另一個查詢,包括計算列:dump(死亡日期)。然後張貼。我們可以從轉儲中學到很多東西 - 所謂「日期」的內部表示(可能是一個郵政編碼)。有了這些,我們可以找出存儲的內容以及如何尋找它。

+0

我現在很好,我用Zastai的提示找到有問題的行。 – ozborn