这是我的查询
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:不是有效月份错误。
答案 0 :(得分:0)
您的查询中有两个位置可能导致错误:
WHERE INVOICE_DATE = '14-Sep-2012'
仅适用于数据库设置,其中'Sep'是一个月的有效缩写(例如英文)。否则你会收到描述的错误。
您的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;
答案 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');