【问题标题】:Oracle queries finding gaps in dates, compare date ranges for gapsOracle 查询查找日期间隔,比较日期范围的间隔
【发布时间】:2013-02-01 01:14:53
【问题描述】:

如何编写查询以查找以下数据空白。

--场景1 -- 查询1 --在同一个表中查找间隙(例如 tableb )

ID      EFF_DT                                  TERM_DT 
800    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      -- GAP 
800    10/16/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM
800    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

--场景2 -- 查询2 --查找2个表(tablea,tableb)之间的不匹配

-- tablea  , sample data below 
ID      EFF_DT                                  TERM_DT 
400    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      
400    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

500    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      
500    10/15/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM      
500    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

-- tableb, sample data below 
ID      EFF_DT                                  TERM_DT 
400    6/15/2012 12:00:00.000 AM    10/13/2012 12:00:00.000 AM      -- mismatch 
400    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

500    6/15/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM      
500    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM


-- Note 400 is a mismatch since ranges are different in both tables, 500 is okay (even though rows are split they still match )
-- Need to identify ID 400 

表格有时有 1/1/1753 表示低日期,12/31/9999 表示高日期。

尝试了以下查询,但在第一种情况下会引发 oracle 错误。 [ ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0 ]

SELECT ID, TERM_DT AS gap_lower_bound, next_date AS gap_upper_bound
  FROM (SELECT t.*,
               LEAD (EFF_DT)
                  OVER (PARTITION BY ID ORDER BY EFF_DT)
                  next_date
          FROM TABLEB t)
 WHERE                                      -- trim(next_date) is not null and
      next_date > TERM_DT + 1

谢谢。

【问题讨论】:

  • 首先,这似乎是两个独立的问题——您应该创建第二个问题并从此处删除第二个问题。 EFF_DT和TERM_DT的数据类型是什么?这些名称暗示它们是DATE 列。但数据与DATE 不一致——DATE 没有小数秒。是TIMESTAMP 吗? VARCHAR2?还有什么?
  • 它的时间戳字段,用作日期。谢谢

标签: sql oracle


【解决方案1】:

对于场景 1,, 让我们取样,

    ID    EFF_DT         TERM_DT 
____________________________________
    800 15-JUN-12   14-OCT-12 --GAP
    800 16-OCT-12   14-NOV-12
    800 15-NOV-12   31-DEC-12
    800 01-JAN-13   01-FEB-13  --GAP
    800 03-FEB-13   01-MAR-13

查询可能是

    SELECT term_dt
FROM
     (SELECT t.*,
          lead(eff_dt,1) OVER (ORDER BY eff_dt) AS next_date
     FROM lead_test t
     )
WHERE term_dt+1<>next_date;

结果:

 term_dt
__________
14-OCT-12
01-FEB-13

对于场景2:

由于select to_date('12/31/9999', 'mm/dd/yyyy')+1 from dual; 抛出相同的错误。,

由于您在 TERM_DT + 1 中使用的 where 子句中的条件,您会收到 ORA-01841 错误,因此您最好更改/减少 12/31/9999 中的值。

【讨论】:

  • 如果我们在31-DEC-12 和02-JAN-2013 之后有间隔,它会起作用吗?
  • 根据上面的查询,它检查TERM_DT的第二天和下一行的EFF_DT是否相等,如果不相等,则将TERM_DT作为OP所需的GAP。因此,如果在 2012 年 12 月 31 日和/或 2013 年 1 月 2 日之后有间隙,它应该可以工作。
猜你喜欢
  • 2019-05-26
  • 2013-03-04
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2014-12-06
相关资源
最近更新 更多