,我們在您查詢兩個地方可能會導致錯誤:
WHERE INVOICE_DATE = '14-Sep-2012'
只有在數據庫設置,其中「月」是一個月有效的縮寫作品(英文爲例)。否則,你會得到所述的錯誤。
您的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;
爲什麼你要做兩個日期轉換和一個子查詢時,你可以直接進行查詢? – Mat
我懷疑有幾個值是畸形的,而不是有效的日期。 我剛剛回答了一個類似的問題,請看http://stackoverflow.com/questions/29625519/check-for-valid-date-which-is-declared-in-varchar2 請勿將DATE存儲爲VARCHAR2。所有這些開銷是由於你的設計有缺陷。添加數據類型爲DATE的另一列。然後在新日期列上執行所需的日期算術,刪除舊列,將新列重命名爲舊列。 –
@Lalit:雖然這是一個很好的建議,但SAP是一個大型的ERP產品,改變模式是可能的,但在維護方面成本相對較高。 (並且您建議的更改在大多數情況下根本不受支持/可能)。 – Mat