1

我在 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
)
;
4

0 回答 0