【发布时间】:2017-04-21 15:40:48
【问题描述】:
抱歉,我对 Oracle SQL 很陌生,所以这可能有一些令人眼花缭乱的错误!
当我将以下语句作为查询的一部分运行时,会出现以下错误: “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')
【问题讨论】:
-
你说得对。年份部分可能是 1999 年或 1998 年,具体取决于交货日期和交易日期之间的差异。因此,如果月份部分是 2 月,而日期部分是 29;你会得到一个错误。在执行其余的 SQL 之前,您需要先检查年份部分是闰年。这是检查闰年的功能:dba-oracle.com/t_detect_leap_year_function.htm
-
这段代码有几个问题。比如你调用
TO_CHAR,它会输出字符串。然后你从另一个字符串中减去一个字符串。 Oracle 是宽容的——它将字符串转换回数字——运气好的话,Oracle 会正确处理(但是,有时它确实会出错)。如果您首先解释您要解决的问题,而不是修复您的代码,您可能会获得更好的帮助;我只是猜测可能存在一个更简单的解决方案。 -
@mathguy,是的,我们可以改进 sql,因为它所做的是从交易日期复制月份和日期,然后从 2000 年减去交货日期和交易日期之间的年份差。希望清楚。
-
表达式
TO_CHAR(extract(year from TO_DATE('01/01/2000','DD/MM/YYYY')), '9999')可以替换为简单的'2000' -
我还是不明白你想要达到什么目的。请edit您的问题并添加一些示例数据和基于该数据的预期输出。
标签: sql oracle tableau-api