比较特定条目的SQL中的日期范围

时间:2014-07-17 19:10:39

标签: mysql sql

我有一个数据库如下:

    ID    |    Term    | Start Date | End Date
    12           6         Jul '12     Dec '12
    12           6         Jan '13     Jun '13
    13           2         Jul '12     Aug '12
    13           12        Jul '12     Jul '13

所以每个ID都是已经完成的交易。这是我正在处理的数据库,看起来有些数据输入不正确。我正在尝试编写一个过滤器,其中显示了相同交易ID的重叠术语。因此,例如,对于ID 12,合同从12月7日到12月合同为期6个月,然后又延长了6个月。对于ID 13,有人输入数据不正确,合同在同一个词中“两次”,日期重叠。

所以我需要的是一个过滤器,它对每个ID集合进行排序(不一定只有两个,合同可以扩展任意次数)并检查该ID中所有日期的有效性,如定义如上。我不是SQL原生的,所以while()循环是我想到的第一件事,但我想知道是否有更简单的方法来应用这种过滤器?

1 个答案:

答案 0 :(得分:1)

您需要找到日期范围重叠的所有行吗?

是否存在主键/此表的任何唯一标识符,以避免将行与自身进行比较?

select * from vt as t1
where exists
 ( select * from vt as t2
   where t1.id = t2.id  -- same ID
   and t1.PK <> t2.PK   -- but not the same row
   and t1.end_date >= t2.start_date -- date ranges
   and t1.start_date <= t2.end_date -- overlap
 )

根据您的数据,您可能需要将比较更改为&lt; / &gt; ,而不是&lt; = / &GT; =