查找日期相互重叠的查找记录

时间:2019-05-09 13:20:29

标签: oracle date plsql

如何查找日期范围重叠的记录。请看下图。 enter image description here

select memid, enrid, memfirstname, memlastname,
       gender, dob, relflag, udfc5, effdate,
       termdate, lvlid5, lvldesc5, lvlid6, lvldesc6
  from zzz_temp
  where memid = '012345'
  order by effdate, termdate;

我从表ZZZ_TEMP中选择一个成员(SUJAN SHRESTHA)作为示例。此表中有超过数百万的成员。我想查找成员中日期范围重叠的此类记录。 在上图中,effdate和termdate分别表示开始日期和结束日期。 记录1和2的生效日期和期限相同,与记录3和4的重叠时间为1个月20天。 我只需要找到这些第一四记录。其他所有记录将被排除,因为effdate大于termdate。

我尝试过的查询。

select t1.*
  from zzz_temp t1
  join t zzz_temp t2 
    on (t1.effdate  > t2.effdate  and t1.effdate  < t2.termdate) or 
       (t1.termdate > t2.effdate  and t1.termdate < t2.termdate) or 
       (t1.termdate > t2.termdate and t1.effdate  < t2.effdate);

但这没用。谁能帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

要检查重叠,请检查表2的结束日期是否大于表1的开始日期,表2的开始日期是否小于表2的结束日期。那会使您的查询像:

select *
from   zzz_temp t1
       inner join zzz_temp t2 
         on t1.memid = t2.memid
            and t2.end_date > t1.start_date
            and t2.start_date < t1.end_date;

您可能希望或不希望将其中的一个或两个不等式转换为包含一个等式(例如t2.end_date <= t1.start_date),具体取决于您认为哪些重叠。