带有OR子句的Oracle sysdate给出了奇怪的结果

时间:2013-06-04 17:22:23

标签: oracle sysdate

我使用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
)
;

0 个答案:

没有答案