重叠日期Oracle SQL

时间:2016-05-24 19:53:50

标签: sql oracle

我尝试仅根据Eff_date和End_Date之间的日期选择那些数据不良的TN。我试图过滤掉坏数据。这就是我所拥有的:

TN          EFF_DATE      END_DATE
3097402606  12/4/2007   1/23/2011 23:59
3097402606  12/4/2007   12/31/2099
4054631308  6/15/2005   2/25/2008 23:59
4054631308  5/9/2008    7/14/2009 23:59
4054631308  5/9/2008    12/31/2099
5745378900  4/10/2012   5/21/2012 23:59
5745378900  2/4/2016    12/31/2099
7062329778  12/16/2008  10/27/2009 23:59
7062329778  10/28/2009  11/10/2009 23:59
7062329778  10/28/2009  12/31/2099

但我只需要选择这个BAD的数据。 EFF_DATE和END_DATE之间存在关系。

  TN            EFF_DATE      END_DATE
 4054631308     6/15/2005     2/25/2008 23:59
 4054631308     5/9/2008      7/14/2009 23:59
 **4054631308       5/9/2008      12/31/2099** 

 7062329778     12/16/2008    10/27/2009 23:59
 7062329778     10/28/2009    11/10/2009 23:59
 **7062329778       10/28/2009    12/31/2099**

正如你所看到的,EFF_DATE正在重复TNs。一旦END_DATE在7月14日确认为4054631308,EFF_DATE不能是5/9/2008,它可以是7/15/2009,也可能不需要在那里,但我需要展示的东西它给我的团队。 我只需要选择看起来像这样的数据,这样我就可以向团队解释我的过程。

我在Oracle SQL中尝试了不同的方法,但还没有成功。在此先感谢您的帮助

1 个答案:

答案 0 :(得分:1)

对于时间段的重叠,您可以使用exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.tn = t.tn and
                    t2.eff_date < t.end_date and
                    t2.end_date > t.eff_date
             );

编辑:

哦,我明白了,你想要所有的TN行,而不仅仅是那些有重叠的行。在这种情况下,一种方法使用in

select t.*
from t
where t.tn in (select t.tn
               from t
               where exists (select 1
                             from t t2
                             where t2.tn = t.tn and
                                   t2.eff_date < t.end_date and
                                   t2.end_date > t.eff_date
                 );