【发布时间】:2014-09-16 14:19:59
【问题描述】:
好的,伙计们,首先,我已经检查了许多有关此错误的网站,但不幸的是,它们都没有帮助我。我有以下简单的查询:
select * from (
select to_date(cal.year || cal.month || cal.day, 'yyyymmdd') as datew,
cal.daytype as type
from vw_calendar cal)
where datew > sysdate;
当我尝试执行整个查询时,会出现此错误:
ORA-01839: 指定月份的日期无效
如果我只执行查询:
select to_date(cal.year || cal.month || cal.day, 'yyyymmdd') as datew,
cal.daytype as type
from vw_calendar cal;
它工作得非常好。如果要查看查询结果:http://pastebin.com/PV95g3ac
我检查了一个月中的日子,比如第 31 天或闰年,一切似乎都是正确的。我不知道该怎么办了。我的数据库是 Oracle 10g,我尝试在 SQL Developer 和 PL/SQL Developer 上执行查询。两个 IDE 上的相同错误。
【问题讨论】:
-
vw_calendar中有多少行?您的 pastebin 缺少 6 个日期:2014-03-05、2014-06-12、2014-06-17、2014-06-23、2014-07-04 和 2014-07-08。如果您认为应该有所有日期,那么也许可以弄清楚为什么没有显示这六个 - 我怀疑存在无效值。您的客户似乎原谅了更简单的查询,但可能隐藏了错误(?)。如果它是一个视图,您可以显示它的定义吗?你能显示数据类型吗? -
共有 4377 行(我使用了
select count(*) from vw_calendar)。我没有注意到这些日期丢失了,我会调查一下,但我想丢失与我的问题无关。无论如何,我已经制作了另一个带有 2014 年 6 月日期的粘贴箱:pastebin.com/imKQTHwP。关于数据类型,对我来说很难,因为这个视图只是来自 ERP(JDE Edwards Enterprise One)的另一个视图的包装。 -
你可以
describe vw_calendar。从新的 pastebin 来看,它们似乎是 varchar2 字段,但确认它和长度可能有用。尽管我仍然想不出任何可以让一个查询运行但不能让另一个查询运行的方法;除了一些东西被推到视图中,但它不像sysdate可以自动分解为年/月/日。您是否尝试过按年过滤内部查询以查看是否可以缩小问题范围? -
感谢您提供有关
describe的有用提示。这里是数据类型:pastebin.com/fndMJX8K。我用where cal.year = 2014和where cal.year = 2014 and cal.month = 06;尝试了内部查询,效果很好。我尝试了其他年份,例如 2012 年和 2013 年。一切都在运行。但是,如果我从查询中删除where dataw > sysdate,它也可以工作。