Oracle で sysdate を OR 句とともに使用すると、奇妙な結果が得られます。sysdate チェックが最初の場合、すべての行は取得されませんが、sysdate チェックが 2 番目の場合、すべての行が取得されます。なぜこれが起こっているのかについての説明を探しています。
以下は、私のクエリの省略版を示しており、その後に、正しい結果または間違った結果をもたらす他の多数の反復が続きます。
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 句が 2 番目であることに注意してください。私がしたのは、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
)
;