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

Mysql 比较SQL中特定条目的日期范围,mysql,sql,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    |    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 12,合同期限为6个月,从2012年7月到12月,然后再延长6个月。对于ID 13,有人输入了错误的数据,合同在同一期限内签订了两次,日期重叠


因此,我需要的是一个过滤器,它可以对每个ID集合进行排序——不一定只有两个,一个合同可以扩展任意次数,并检查该ID内所有日期的有效性,如上所述。我不是SQL本地人,所以我首先想到的是while循环,但我想知道是否有更简单的方法来应用这种过滤器?

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

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

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
 )

根据您的数据,您可能必须将比较改为而不是=

您的日期格式很糟糕。它们应存储为日期。如果必须将它们存储为字符,则使用YYYY-MM格式。这样做会更容易进行比较。查询是可能的…可以检测到重叠的日期范围,但根据gordon的说法,这些日期的格式需要克服。它们存储为日期,我只是没有将它们作为日期进行复制,很抱歉,对于Postgres,您可以创建一个约束,首先阻止将这些值放入数据库。