我有下表(person_program):
program_id person_id start_date end_date
1 15588499 01-01-2014 02-16-2014
2 15588499 02-17-2014 03-01-2014
3 15588499 02-15-2014 02-21-2014
我需要获取同一个表中另一个时间段所包含的program_id(在这种情况下,program_id = 3)。
有什么想法解决这个问题吗?
谢谢!
答案 0 :(得分:0)
是的,您可以引用同一个表并获得重叠时段:
select t1.program_id ThisOne, t2.program_id OverlapsWith
from person_program t1
inner join person_program t2
on t1.program_id < t2.program_id
and t1.person_id = t2.person_id
and t2.start_date > t1.end_date
答案 1 :(得分:0)
尝试:
select *
from person_program x
where exists (select 1 from person_program y where y.start_date <= x.start_date and y.person_id = x.person_id and y.program_id <> x.program_id)
or exists (select 1 from person_program y where y.end_date >= x.end_date and y.person_id = x.person_id and y.program_id <> x.program_id)
注意:这会找到这样的情况:对于相同的person_id,表上有另一条记录,具有不同的program_id,其开始和结束日期已完全包含在另一条记录的范围内。
编辑:我只是将AND改为OR,就像看起来一样,从你的帖子中,你正在寻找部分,不一定是完整的重叠。这应该这样做。
答案 2 :(得分:0)
假设您要传递program_id
想要找到的重叠,并且部分重叠是正常的:
DECLARE @program_id int = 3
SELECT PP.program_id,
PP.person_id
FROM person_program PP
INNER JOIN person_program Source
ON PP.start_date <= Source.end_date
AND PP.end_date >= Source.start_date
AND Source.program_id = @program_id