诡异的ora01861 文字与格式字符串不匹配

sql如下

select count(1) from t where t.create_date > to_date('2022-03-10 12:00:00','yyyy-mm-dd hh24:mi:ss')

或修改为

select count(1) from t where to_char(create_date ,'yyyy-mm-dd hh24:mi:ss')> '2022-03-10 12:00:00'

t是一个视图,oracle版本是12c,create_date类型未知,猜测是date(只有视图权限)。
sql在navicat下执行成功。用jdbc执行报错ora01861。尝试更换各版本驱动,问题依旧,求指教解决方案。

如果要确认视图的字段类型,可以查all_tab_cols视图

select * from all_tab_cols t where t.table_name='视图名称'

如果确认这个字段是date类型,那么你上面写的这两个sql都没问题,这个时候,还有两个地方可能有问题

  1. java拼接sql的时候,拼出来的不是这个样子,只是你以为是这个样子
  2. 视图本身有问题,oracle的视图是不会进行完整的数据校验的,可能视图中部分数据格式不对,导致无法使用统一的方式进行转换,而通过不同客户端查询的时候,可能扫描到了不同的数据块,就会出现同一个sql一边报错一边不报错的情况

问题原因确定了,是视图本身的SQL使用了"condition betwenn to_date(sysdate - 180) and to_date(sysdate)"这种写法,在PL/SQL中解析没有任何问题,JDBC解析会出现错误。sysdate本身已经是date类型了,不需要再次to_date()。