在查询SAP表时,Oracle中没有有效的月份错误

时间:2015-04-14 11:27:58

标签: sql oracle sap

这是我的查询

SELECT *
  FROM (SELECT TO_DATE(INV_DATE, 'YYYYMMDD') INVOICE_DATE
          FROM SAPSCH.SAP_TABLE T
         WHERE T.INV_DATE <> '00000000')
 WHERE INVOICE_DATE = '14-Sep-2012';

SAPSCH.SAP_TABLE是一个使用dblink连接到SAP架构的视图。 INV_DATE列的格式为'YYYYMMDD'。例如,'2014 -Sep-2012'的'20120914'。内部查询返回15k +记录。但是,当我运行完整查询时,它会给我错误 ORA-01843:不是有效月份错误。

2 个答案:

答案 0 :(得分:0)

您的查询中有两个位置可能导致错误:

  1. WHERE INVOICE_DATE = '14-Sep-2012'仅适用于数据库设置,其中'Sep'是一个月的有效缩写(例如英文)。否则你会收到描述的错误。

  2. 您的SAP数据库可能包含不正确的数据,例如“20151301”,这也会触发此错误。

  3. 在您的简单查询中,您当然可以简单地编写以下内容: - )

    SELECT DATE'2012-09-14' AS INVOICE_DATE
    FROM SAPSCH.SAP_TABLE T
    WHERE T.INV_DATE = '20120914';
    

    但是,如果您想要处理所有日期,而不仅仅是2012年9月14日,那么您必须检查日期是否有效。不幸的是,Oracle没有我所知道的检查功能。所以你不能单独用SQL解决这个问题,但需要PL / SQL:

    -- Return the date from the SAP string or NULL for invalid date strings
    create or replace function f_get_date_from_sap_datestring(vi_sap_datestring varchar2)
      return date as
    begin
      return to_date(vi_sap_datestring, 'yyyymmdd');
    exception when others then
      return null;
    end;  
    

    然后:

    select f_get_date_from_sap_datestring(inv_date) as invoice_date
    from sapsch.sap_table
    where f_get_date_from_sap_datestring(inv_date) is not null;
    

答案 1 :(得分:0)

始终建议使用to_date到2012年9月14日的显式转换

SELECT *
  FROM (SELECT TO_DATE(INV_DATE, 'YYYYMMDD') INVOICE_DATE
      FROM SAPSCH.SAP_TABLE T
     WHERE T.INV_DATE ='20120914')
WHERE INVOICE_DATE = to_date('14-Sep-2012','DD-Mon-YYYY');