我有一个 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/