如何在WHERE子句中放置SYSDATE会影响结果集?

时间:2014-05-14 13:49:01

标签: sql oracle oracle11g

我在两个Oracle 11 DB-Host上遇到了一个相当奇怪的情况,我无法在其他任何地方重现:

给出一个相当简单的表:

CREATE TABLE TESTTABLE ( XID NUMBER(10) NOT NULL,
                         XSTRING CHAR(14 BYTE) NOT NULL,
                         XDATE DATE NOT NULL )
LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING;

充满了相当简单的数据:

INSERT INTO TESTTABLE(XID, XSTRING, XDATE)
VALUES(1119870, 'R008505       ', TO_DATE('08/01/2007 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));

然后这个查询:

SELECT * 
  FROM TESTTABLE
 WHERE xstring='R008505'
   AND (xdate >= SYSDATE OR xdate < '01.01.1900');

返回表中唯一的行(当然是错误的),而以下查询(交换了SYSDATE行)返回0行:

SELECT * 
  FROM TESTTABLE
 WHERE xstring='R008505'
   AND (xdate < '01.01.1900' OR xdate >= SYSDATE);

使用TRUNC(SYSDATE)在这里没有任何区别。

如何发生这种情况以及如何解决此问题?

1 个答案:

答案 0 :(得分:2)

这与a previous question非常相似,可能与错误9495697有关,但在这种情况下未得到确认。我无法分享MOS中的错误详细信息,但someone else has already done so

在这种情况下,您在基础11.2.0.1版本上遇到的症状在11.2.0.3 or on SQL Fiddle, which is running 11.2.0.2上没有显示出来。

如果是那个bug,那么应用11.2.0.2补丁集应该可以治愈它,或者补丁可用于此问题;在应用补丁之前,不确定是否需要提出服务请求并确认症状是否与特定错误相匹配。