【问题标题】:ORA-08143(not a valid month)ORA-08143(无效月份)
【发布时间】:2014-05-23 06:16:56
【问题描述】:

我在表中有一个日期列,它是 varchar2(10)。 我正在使用选择查询从表中获取一些数据。它继续像:

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: not a valid month。

但是,当我将上述查询修改为:

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”

【问题讨论】:

  • 我认为您选择的未公开部分以及其中不包含任何日期?
  • 麻烦从这里开始“masc_date 是日期列,它是 varchar2(10)”。日期列应将日期作为其数据类型。现在剩下的就是数据清理了。 Rene 的剧本是一个好的开始。

标签: oracle


【解决方案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;

【讨论】:

  • 嗨勒内!非常感谢你的帮助。问题出在数据中有些值不合适,因为是生产数据,我什至没有考虑这一点。
  • 如果不检查数据迟早会被垃圾填满。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多