【发布时间】:2014-08-19 11:04:59
【问题描述】:
我遇到以下错误的问题
ORA-01843: 月份无效
如果我使用以下查询效果很好
SELECT mx.work_order_no, mx.work_order_name, mx.comments
FROM max_orders mx
WHERE TO_DATE (wo_dt, 'dd/mm/rr') <= (TO_DATE (SYSDATE, 'dd/mon/rr') - 7)
但是,如果我将 where 条件子句更改为
WHERE TO_DATE (wo_dt, 'dd/mm/rr') >= (TO_DATE (SYSDATE, 'dd/mon/rr') - 7)
我遇到了问题
ORA-01843: 月份无效
是什么原因造成的,我该如何解决这个错误?
更新 1
基础视图
SELECT work_order_no,
work_order_name,
wo_dt,
comments
FROM (SELECT mx_master.work_order_no,
mx_master.work_order_name,
SUBSTR (mx_master.uom, 1, 15) wo_dt,
mx_master.remarks
FROM mx_wo_data mx_master)
【问题讨论】:
-
由于
>>的条件,您可能会得到一个不是有效日期的值 -
该条件在日期转换后应用。查看执行计划以查看条件更改是否仍在改变它会很有趣;但我怀疑可能还有其他未显示的过滤器。无论哪种方式,
wt_dt都是一个字符串,其值与您的模式不匹配;或者它是一个日期并且您的 NLS 设置与您使用的格式模型不匹配。可能数据有问题,是的 - 这就是为什么您不应该将日期存储为字符串。 -
TO_DATE (SYSDATE, 'dd/mon/rr')没有任何意义。to_date()将varchar转换为date。sysdate已经是一个日期。 To call 首先将sysdate转换为varchar,然后将其转换回date。 -
你能添加表的 DDL 和两个查询的执行计划吗?您能否澄清第一个查询是否完全按照所示工作 - 您从两个查询中删除了其他条件以进行测试?好吧,我说桌子……
max_orders是桌子,还是视图?如果是视图,请显示其定义以及基础表的结构。听起来仍然像 NLS 问题.... -
因此,根据视图定义,
wo_dt是一个字符串,而不是日期,并且其中的值不代表您正在使用的格式模型的有效日期。