2014-05-23 81 views
1

我有一個表是varchar2(10)的日期列。 我正在使用select查詢從表中提取一些數據。如此下去,如:ORA-08143(不是有效的月份)

Select 
    ......................... 
from 
    ......... 
where 
    ................ 
    and (to_date(masc_date,'dd-mm-yyyy') between 
    to_date('10-05-2014','dd-mm-yyyy') and to_date('11-05-2014','dd-mm-yyyy')) 

的masc_date是日期列是VARCHAR2(10)和在該列中的日期值在格式「DD-MM-YYYY」。 當我執行上述查詢時,我得到ORA-08143:不是有效月份。

然而,當我修改我上面的查詢爲:

Select 
    ......................... 
from 
    ......... 
where 
    ................ 
    and (to_date(masc_date,'dd-mm-yyyy') between 
    (select to_date('10-05-2014','dd-mm-yyyy') from dual) and 
    (select to_date('11-05-2014','dd-mm-yyyy') from dual)) 

查詢工作正常。我無法找到此錯誤的原因,因爲在我的第一個查詢中,所有「to_date」中的日期值都是相同的格式和char值。

注:在我的數據庫中的NLS語言是美國和日期格式是「DD-MON-RR」

+1

我認爲您的選擇的未公開部分和哪裏不包含任何日期? – Rene

+0

麻煩從這裏開始「masc_date是日期列,它是varchar2(10)」。日期列應具有DATE作爲其數據類型。現在你剩下的數據清理。雷內的劇本是一個好的開始。 –

回答

1

首先要做的是檢查是否所有的數據確實是DD-MM- yyyy格式。通常情況下,數據不可信。

declare 
    cursor c is select masc_date from table; 
    l_date date; 
begin 
    for r in c loop 
    begin 
     l_date := to_date(r.masc_date,'dd-mm-yyyy'); 
    exception 
     when others then 
     -- print out date that is not in the form dd-mm-yyyy 
     dbms_output.put_line(r.masc_date); 
    end; 
    end loop; 
end; 
+0

嗨雷內!非常感謝你的幫助。問題出在一些價值不適當的數據上,因爲它是生產數據,我甚至沒有對這一點進行思考。 – Mayank

+1

如果數據遲早不被檢查,它將填滿垃圾。 – Rene

相關問題