2015-04-14 41 views
0

這是我的查詢沒有在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年 - 2012年'的'20120914'。內部查詢返回15k +記錄。但是當我運行完整的查詢時,它給了我錯誤ORA-01843:不是有效的月份錯誤。

+1

爲什麼你要做兩個日期轉換和一個子查詢時,你可以直接進行查詢? – Mat

+0

我懷疑有幾個值是畸形的,而不是有效的日期。 我剛剛回答了一個類似的問題,請看http://stackoverflow.com/questions/29625519/check-for-valid-date-which-is-declared-in-varchar2 請勿將DATE存儲爲VARCHAR2。所有這些開銷是由於你的設計有缺陷。添加數據類型爲DATE的另一列。然後在新日期列上執行所需的日期算術,刪除舊列,將新列重命名爲舊列。 –

+0

@Lalit:雖然這是一個很好的建議,但SAP是一個大型的ERP產品,改變模式是可能的,但在維護方面成本相對較高。 (並且您建議的更改在大多數情況下根本不受支持/可能)。 – Mat

回答

0

,我們在您查詢兩個地方可能會導致錯誤:

  1. WHERE INVOICE_DATE = '14-Sep-2012'只有在數據庫設置,其中「月」是一個月有效的縮寫作品(英文爲例)。否則,你會得到所述的錯誤。

  2. 您的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; 
+0

1)我的數據庫將接受'14-Sep-2012'。 2)如果我單獨運行它,這意味着沒有不正確的數據,內部查詢返回所有行,沒有任何錯誤。 – Nitish

+0

好吧,我猜,Oracle很難將'14-Sep-2012'轉換成日期。最後它只是一個字符串,你不會告訴dbms如何轉換它。千萬不要使用一些日期字符串而不是日期。可以使用日期文字(如'DATE'2012-09-14''')或日期轉換(例如'to_date('14 -sep-2012','dd-mon-yyyy','NLS_DATE_LANGUAGE = AMERICAN')') 。如您所見,在轉換月份名稱時,請始終指定NLS_DATE_LANGUAGE以使其獨立於設置運行。 –

0

它始終是adviceable使用使用TO_DATE明確轉化爲14月 - 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'); 
相關問題