2017-04-21 58 views
0

道歉,我很新的的Oracle SQL所以有可能是一些令人眼花繚亂的不對的!日期建設Oracle服務器「Oracle數據庫錯誤1839年」

當我運行下面的語句作爲查詢的一部分,給出了以下錯誤: 「Oracle數據庫錯誤1839年:ORA-01839:日期不適用於指定月」

我覺得這事做與閏年,因爲當我過濾我的時間序列的最新數據(3月 - 當前日期)則沒有錯誤提前給出了

感謝

(TO_CHAR(extract(year from TO_DATE('01/01/2000','DD/MM/YYYY')), '9999') 
- 
(
TO_CHAR(extract(year from "DELIVERY_DATE"), '9999') 
- TO_CHAR(extract(year from "TRADING_DATE"), '9999') 
) 
) 

|| TO_CHAR(extract(month from "TRADING_DATE"), 'FM00') 
|| TO_CHAR(extract(day from "TRADING_DATE"), '99') 

,'YYYYMMDD') 
+0

特殊照顧是正確的。年份可能是1999年或1998年,具體取決於交割日期和交易日期之間的差異。所以如果月份部分是二十九,日部分是二十九;你會得到一個錯誤。您需要首先檢查年份是閏年,然後再執行其餘的SQL。以下是檢查閏年的功能:http://www.dba-oracle.com/t_detect_leap_year_function.htm – anonyXmous

+4

此代碼有幾個錯誤。例如,您可以調用輸出字符串的'TO_CHAR'。然後你從另一箇中減去一個字符串。甲骨文是寬容的 - 它會將字符串轉換回數字 - 並且運氣好的話,甲骨文將會正確地做到這一點(然而,有時它確實會錯誤)。如果你能解釋你最初想解決什麼問題,而不是修復你的代碼,那麼你可能會得到更好的幫助;我只是猜測一個更簡單的解決方案可能存在。 – mathguy

+0

@mathguy,是的,我們可以改進sql,因爲它所做的是複製交易日期的月份和日期,然後從2000年減去交貨日期和交易日期之間的年份差異。希望它是明確的。 – anonyXmous

回答

0

,因爲你是從2000年全年這是減去一年閏年,我將更改您的SQL以檢查DELIVERY_DATE和TRADING_DATE之間的差異是否不能被4整除;如果不能被4整除(比如1999年的閏年不是閏年是2月29日,那麼可以用1999年2月28日)。如果您將參考年定義爲閏年的2000年,這將僅適用。如果您更改參考年份<> 2000,我可以給您另一個答案。希望這有助於您。

SELECT TO_DATE(
     CASE WHEN mod(extract(year from "DELIVERY_DATE") - extract(year from "TRADING_DATE"),4)!=0 
      AND to_char("TRADING_DATE", 'mm/dd') = '02/29' 
    then to_char(extract(year from TO_DATE('01/01/2000','DD/MM/YYYY')) - 
      extract(year from "DELIVERY_DATE") + 
      extract(year from "TRADING_DATE")) || 
      to_char("TRADING_DATE" - 1, 'mmdd') 
    else to_char(extract(year from TO_DATE('01/01/2000','DD/MM/YYYY')) - 
      extract(year from "DELIVERY_DATE") + 
      extract(year from "TRADING_DATE")) || 
      to_char("TRADING_DATE", 'mmdd') 
    END,'YYYYMMDD') AS ANSWER 
    FROM DUAL; 
+1

表達式'to_char(extract(年份從TO_DATE('01/01/2000','DD/MM/YYYY'))'可以用一個簡單的''''替換,但實際上應該是'2000'數字不是字符串) –