TO_DATE在Oracle中不是有效的月份错误

2fjabf4q  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(158)

这是我的查询

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'。例如,“20120914”代表“14-Sep-2012”。内部查询返回15 k+条记录。但是当我运行完整的查询时,它给了我这个错误:

ORA-01843:不是有效月份

wvt8vs2t

wvt8vs2t1#

查询中有两个地方可能会导致错误:

  1. WHERE INVOICE_DATE = '14-Sep-2012'仅适用于数据库设置,其中“Sep”是一个月的有效缩写(例如英语)。否则你会得到描述的错误。
    1.您的SAP数据库可能包含不正确的数据,例如“20151301”,这也会触发此错误。
    在你的简单查询中,你当然可以简单地写如下:- )
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;
x759pob2

x759pob22#

始终建议使用to_date显式转换为14-Sep-2012

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');

相关问题