一尘不染

ORA-01839在where子句中的to_date“日期在指定的月份无效”

sql

我有以下查询(BOCRTNTIME - varchar e.g 2015-02-28 12:21:45, VIEW_BASE_MARIX_T - some view):

select BOCRTNTIME
    from VIEW_BASE_MARIX_T
    where to_date(substr(BOCRTNTIME,1,10),'YYYY-MM-DD')
        between (to_date ('2016-01-01', 'YYYY-MM-DD'))
            and (to_date ('2016-02-01', 'YYYY-MM-DD'))

执行时出现错误:

ORA-01839:  "date not valid for month specified"

我认为中可能存在不正确的数据BOCRTNTIME,因此请执行以下查询:

select distinct
         substr(BOCRTNTIME,1,8),
         substr(BOCRTNTIME,9,2)
  from VIEW_BASE_MARIX_T
 order by substr(BOCRTNTIME,9,2);

但一切看起来都很好:http :
//pastebin.com/fNjP4UAu。同样,以下查询执行也没有任何错误:

select to_date(substr(BOCRTNTIME,1,10),'YYYY-MM-DD') 
  from VIEW_BASE_MARIX_T;

我已经尝试过添加trunc()所有内容,to_date()但没有运气。另外,我创建了一个pl /
sql过程,该过程采用一项一项的形式VIEW_BASE_MARIX_T并将其转换为日期-一切正常。有什么想法为什么我在第一次查询时会出错?

UPD:在视图中使用的表查询正常,但在视图中-不

UPD2:我们使用相同产品的环境很少,但只能在一种产品上出错

UPD3:通过在视图中使用的表中搜索无效日期解决了问题


阅读 181

收藏
2021-05-30

共1个答案

一尘不染

我认为可能正在发生的事情是Oracle正在将谓词推送到视图的基础表。

您是否尝试过运行查询

select to_date(substr(BOCRTNTIME,1,10),'YYYY-MM-DD') BOCRTNTIME
from MY_TABLE

而不是查询视图?

您也可以使用NO_PUSH_PRED提示进行确认

select /*+ NO_PUSH_PRED(VIEW_BASE_MARIX_T) */
BOCRTNTIME
from VIEW_BASE_MARIX_T
where 
to_date(substr(BOCRTNTIME,1,10),'YYYY-MM-DD') between (to_date ('2016-01-01', 'YYYY-MM-DD')) and (to_date ('2016-02-01', 'YYYY-MM-DD'))
2021-05-30