我在 Oracle 中使用 sysdate 和 OR 子句得到了一些奇怪的结果。如果首先进行 sysdate 检查,我不会得到所有行,但如果 sysdate 检查是第二个,我会得到所有行。寻找关于为什么会发生这种情况的任何解释。
下面显示了我的查询的缩写版本,然后是许多其他迭代,它们给出了正确或不正确的结果。
Oracle 数据库 11g 版本 11.2.0.1.0 - 64 位生产
不正确:注意 sysdate 子句是第一个
SQL> select count(*) from employee emp
where
(emp.TERM_DATE >= (sysdate-30)) OR (emp.TERM_DATE =
TO_DATE('01/01/1700', 'MM/DD/YYYY'));
COUNT(*)
----------
5
正确:注意 sysdate 子句是第二个。我所做的只是颠倒 OR 语句中的 2 个子句
SQL> select count(*) from employee emp
where
(emp.TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY')) OR (emp.TERM_DATE>=(sysdate-30));
COUNT(*)
----------
1506
下面是一些其他查询字符串
select count(*) from cohp91.employee
where
(
--(TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') OR TERM_DATE >= sysdate-30) -- CORRECT
--TERM_DATE >= sysdate-30 OR TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') -- INCORRECT
--(select ADD_MONTHS(sysdate,-1) from dual) <= term_Date OR TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') -- CORRECT
-- (term_Date >= trunc(ADD_MONTHS(sysdate,-1)) OR TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') ) -- INCORRECT
-- term_Date >= (select sysdate-30 from dual) OR TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') -- CORRECT
-- (TERM_DATE >= to_date(to_char(sysdate-30,'MM/DD/YYYY'),'MM/DD/YYYY')) OR TERM_DATE = TO_DATE('01/01/1700', 'MM/DD/YYYY') -- INCORRECT
)
;