I am getting some strange results using sysdate along with an OR clause in Oracle. If the sysdate check is first I do not get all of my rows, but if the sysdate check is second I do get all of my rows. Looking for any explanations as to why this is happening.
Below shows an abbreviated version of my query, followed by numerous other iterations that give correct or incorrect results.
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
Incorrect: Note sysdate clause is first
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
Correct: Note sysdate clause is second. All I did was reverse the 2 clauses in the OR statement
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
Below are a number of other query strings
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
)
;