我在查詢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;
但它沒有找到有問題的行。
deceased_dt_tm的數據類型是什麼? –
第一種方法是將日期和主人密鑰一起插入臨時表中。你仍然應該得到那個插入的錯誤,但是主鍵會讓你檢查看起來不好的行,看看發生了什麼。一旦你知道他們壞的方式,你可以尋找一種方法來修復或過濾它們。 – Zastai
DECEASED_DT_TM是日期 – ozborn