列出Oracle表中具有重叠日期范围的记录

时间:2018-01-21 04:45:10

标签: sql oracle

我列出了包含列

的表中员工的过往经验记录
Registration_No,Join_Date,Resgn_Date

enter image description here

我需要列出日期重叠的Registration_No

黄色方块表示有一圈重叠。

我可以使用任何oracle函数吗?

以下示例数据:

CREATE table A (REGISTRATION_NO number,JOIN_DATE date,RESG_DATE date);

INSERT INTO A values(100,'1-JAN-93','30-DEC-93');
INSERT INTO A values(100,'1-MAY-93','20-MAY-93');
INSERT INTO A values(101,'1-DEC-93','1-NOV-95');
INSERT INTO A values(102,'1-JAN-96','30-MAY-96');
INSERT INTO A values(102,'5-MAY-96','20-DEC-96');

4 个答案:

答案 0 :(得分:1)

您可以使用exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.Registration_No = t.Registration_No and
                    t2.Resgn_Date > t.join_date and
                    t2.join_date < t.resgn_date
             );

答案 1 :(得分:1)

select t.reg_number,t.JOIN_DATE,resign_date
from registration t
where exists (select 1
              from registration t2
              where t2.reg_number = t.reg_number and
                    t2.resign_date > t.join_date and
                    t2.join_date < t.resign_date
                    and t2.rowid<>t.rowid
             )
             order by reg_number,JOIN_DATE;

enter image description here

答案 2 :(得分:0)

您可以在同一个表上使用自联接或内部联接。

select 
   t1.Registration_No
from 
   t t1 inner join t t2 on 
  (t1.Registration_No = t2.Registration_No) and 
  ((t1.Resgn_Date - 1) =t2.join_date);

答案 3 :(得分:0)

使用原始数据:

select a1.registration_no, a1.join_date, a1.resg_date as resg_date1
     , a2.resg_date as resg_date2
from   a a1
       join a a2
            on   a2.registration_no = a1.registration_no
            and  a2.resg_date > a1.join_date
            and  a2.resg_date < a1.resg_date;

REGISTRATION_NO JOIN_DATE   RESG_DATE1  RESG_DATE2
--------------- ----------- ----------- -----------
           7673 25/08/2001  31/12/2001  26/08/2001
          24939 28/01/1998  05/03/2003  29/01/1998

您可以对此进行更多优化,以包含介于现有加入和辞职日期之间的加入日期。