gpt4 book ai didi

sql - ORA-01843 : not a valid month When where condition is changed

转载 作者:行者123 更新时间:2023-12-02 07:28:11 30 4
gpt4 key购买 nike

我有以下错误的问题

ORA-01843: not a valid month

如果我使用以下查询效果很好

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: not a valid month

这是什么原因造成的,我该如何解决这个错误?

更新 1

底层 View

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)

最佳答案

SYSDATE 已经是一个日期。您不应将其传递给 TO_DATE()。当您这样做时,您正在对字符串进行隐式转换,然后进行显式转换。戈登·利诺夫 (Gordon Linoff) 已经展示了一种更好的方法。

根据您添加的 View 定义,wo_dt 是一个字符串。您希望它采用 dd/mm/rr 格式。该错误告诉您该列中的值实际上不是那种格式,因此您需要检查 View 或基础表中的数据以查看哪些记录具有不正确的数据。

你可以使用 something like this要么排除格式不正确的值;或者更有用地识别错误的值,以便可以删除或更正它们,例如像这样:

select * from max_orders
where my_to_date(wo_dt, 'dd/mm/rr') is null;

或来自基础表:

select * from mx_wo_data
where my_to_date(substr(uom, 1, 8), 'dd/mm/rr') is null;

如果您无法创建函数,则可以在匿名 block 中使用相同的逻辑。


奇怪的是,更改条件会导致错误,因为您的(隐式和显式)转换是在评估条件之前应用的,并且使用该函数意味着无法使用该列上的任何索引;因此(在没有任何其他过滤器的情况下)您应该对两个查询进行全表扫描,转换应该在过滤之前应用于列中的所有值,并且您应该以任何一种方式得到错误。所以这并没有真正回答问题的那个方面。

关于sql - ORA-01843 : not a valid month When where condition is changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25381797/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com