赚取款项或计数时,ORA-01847月的月份必须在1到最后一天的错误之间



在我的数据库中,我有一个日期列,当我尝试运行以下查询时,该列是varchar2格式的,我会得到ora -01847错误。

SELECT NVL(SUM(TOTAL_QOH),0) 
 FROM V_STOCK_ENQUIRY 
 WHERE LOCATION_ID = 82 
   AND TO_DATE(EXPIRY_DATE, 'DD-MM-YYYY')>= TO_DATE('01-11-2017', 'DD-MM-YYYY') 
   AND TO_DATE(EXPIRY_DATE, 'DD-MM-YYYY')<= TO_DATE('01-11-2017', 'DD-MM-YYYY') 

但是,当我尝试运行相同的查询时,只需拿到total_qoh而不是总和,我就会正确。谁能帮我解决这个问题。

行的一部分可能不会导致错误,但是当您总和时,就会检查每个行并发生错误。检查您的数据,某处应该有错误的值,例如,您可以使用以下块代码。但是最好的选择是将列类型更改为date。存储日期是因为Varchars会导致此类问题,并且很难构建查询等。

declare 
  dt date;
begin 
  for r in (select rowid, expiry_date from v_stock_enquiry) loop
    begin
      dt := to_date(r.expiry_date, 'dd-mm-yyyy');
    exception when others then
      if sqlcode in (-1839, -1847) then
        dbms_output.put_line('value: '||r.expiry_date||' is not correct');
        dbms_output.put_line('rowid: '||r.rowid);
        dbms_output.put_line(sqlerrm);
      else
        dbms_output.put_line(sqlcode);
        dbms_output.put_line(sqlerrm);
      end if;
    end;
  end loop;
end;

相关内容

最新更新