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);
但这没用。谁能帮我解决这个问题。
答案 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
),具体取决于您认为哪些重叠。