SQL Query将时间段包含在同一个表中的另一个时间段中

时间:2014-02-17 23:31:53

标签: sql date intervals range

我有下表(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)。

有什么想法解决这个问题吗?

谢谢!

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

SQL Fiddle demo

答案 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