Oracle Sysdate>空值

时间:2016-07-12 09:40:24

标签: sql oracle

我正在研究一些与未来日期类似的情景。

我有一张与此类似的表格

ProductID   ProductStatus EffectiveFromDate EffectiveToDate CancelledIndicator
----------- ------------- ----------------- --------------- ------------------
345         A             7/7/2016          (null)          1
345         S             7/7/2016          11/7/2016       (null)
345         A             12/7/2016         (null)          (null)

我需要获取当前日期的产品 如果我找到取消的指标,则意味着它不再活跃 如果他们是两行一个具有未来日期状态。 根据上面的表格,如果我检查efd< sysdate和etd为null。但要获得当前的活动状态,这是我需要实施的情况。

我需要检查sysdate是否b / w旧记录的efd和etd,如果不是我需要采取最新记录,这将是当前状态。

我有查询这样做

但是当我检查

时会发生什么
sysdate between efd and etd where etd can be null most of the time.

1 个答案:

答案 0 :(得分:0)

有关如何处理它的一些示例:

<强>设置:

SQL> create table testNull (id, startDate, endDate) as
  2  (
  3  select 1, null,       sysdate + 1 from dual union all
  4  select 2, sysdate -1, sysdate + 1 from dual union all
  5  select 3, sysdate -1, null        from dual union all
  6  select 4, sysdate -3, sysdate - 1 from dual
  7  );

Table created.

不处理NULL:

SQL> select *
  2  from testNull
  3  where sysdate between startDate and endDate ;

        ID STARTDATE ENDDATE
---------- --------- ---------
         2 11-LUG-16 13-LUG-16
使用COALESCE

SQL> select *
  2  from testNull
  3  where sysdate between startDate and coalesce(endDate, sysdate);

        ID STARTDATE ENDDATE
---------- --------- ---------
         2 11-LUG-16 13-LUG-16
         3 11-LUG-16

使用一些布尔逻辑:

SQL> select *
  2  from testNull
  3  where sysdate >= startDate
  4    and ( endDate is null or sysdate <= endDate);

        ID STARTDATE ENDDATE
---------- --------- ---------
         2 11-LUG-16 13-LUG-16
         3 11-LUG-16