我使用sysdate和Oracle中的OR子句获得了一些奇怪的结果。 如果sysdate检查是第一次我没有得到我的所有行,但如果sysdate检查是第二次我得到我的所有行。寻找有关为何发生这种情况的任何解释。
下面显示了我的查询的缩写版本,然后是许多其他迭代,它们给出了正确或不正确的结果。
Oracle Database 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
)
;