java - ORA-01861 : literal does not match format string error isn't always shown in similar cases

标签 java database oracle date

我有一个 select SQL 查询,其中包含以下内容:

to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss')

该日期的值是使用以下 java 代码行生成的:

Date maxDate = new Date(Long.MAX_VALUE);

很明显,年份 292278994 与“yyyy”不匹配。 问题:运行我的查询会导致

ORA-01861: literal does not match format string

在主数据库上,但不在备份数据库上。数据库完全等效,备份当然是主数据库的副本。它们都是 Oracle 11.2。 我想这取决于某些配置,但我找不到任何东西。

有谁知道这是什么原因吗? 谢谢!

最佳答案

检查实际查询的解释计划,因为看起来您有不同的计划,其中一个是“短路”条件;它实际上并没有抽出时间来查看日期格式。

这就是我的意思:

select *
from dual
where 1=0
AND sysdate < to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss')

对比

select *
from dual
where 1=0
OR sysdate < to_date('292278994-08-17 08:12:55.807', 'yyyy-mm-dd hh:mi:ss')

上面的第一个查询将返回 0 行并且不会报告错误(至少对我来说不会),但第二个查询会报告错误。这是因为数据库可以首先评估 1=0(假),并且根本不需要检查第二个条件,因为 FALSE AND(TRUE 或 FALSE)始终为 false,而使用 OR 时,第二个条件可能返回 TRUE并且 WHERE 子句返回 TRUE 结果。

对于任何感兴趣的人,在第一个查询的计划中,我得到这个:

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(NULL IS NOT NULL AND SYSDATE@!<TO_DATE('292278994-08-17 
              08:12:55.807','yyyy-mm-dd hh:mi:ss'))

(请注意,它不再是 1=0,而是 NULL IS NOT NULL)

在第二个中,它知道 1=0 可以完全省略:

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!<TO_DATE('292278994-08-17 
              08:12:55.807','yyyy-mm-dd hh:mi:ss'))

关于java - ORA-01861 : literal does not match format string error isn't always shown in similar cases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264967/

相关文章:

java - ORA-12518,TNS :listener could not hand off client connection oracle 11g

java - 子线程返回值

具有 lambda 表达式的 Java 泛型对象

database - ORM是什么意思?

mysql - 如何计算每个球员的最长连胜纪录

java - Eclipse 链接版本从 2.1 升级到 2.5 导致问题

java - 在jsp中显示来自数据库的数据 - MVC

java - JPA - 使用一对多关系数组列表更新实体

java.lang.NoSuchFieldError : DEF_CONTENT_CHARSET 错误

php - 使用子查询插入查询