2017-04-21 32 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'数字不是字符串) –