sql查询以检查2个事件是否重叠

时间:2015-07-09 21:04:36

标签: mysql sql date overlap

我的表有3列名称,start_date和end_date 只有当新事件的日期与现有事件重叠时,我才需要在表格中插入记录。 所以,假设我的开始日期为2015年1月1日,结束日期为2015年12月31日 如果有这样的日期,我就无法插入事件:

  • 2014年12月31日 - 2016年1月1日
  • 2015年2月1日 - 2015年12月30日
  • 2014年12月31日 - 2015年1月6日
  • 2015年2月1日 - 2016年1月1日

或者,谈论整合者:

  • 范围为2 ... 6
  • 的现有记录

可能的无效记录:

  • 1..3
  • 3..5
  • 5..7
  • 1..7

符合此条件的短表达式是什么?

2 个答案:

答案 0 :(得分:4)

当(并且仅当)第一个开始小于第二个开始时,任何2个范围重叠,而第二个开始小于第一个开始。

因此,您希望测试您的传入记录的开始日期和结束日期与表中任何记录的条件不匹配。

这是一个视觉证明 - 两条线可以重叠的所有方式:

  
1.
s1|--------|e1
s2|--------|e2


2.
s1|-------|e1
     s2|--------|e2


3.
     s1|--------|e1
s2|--------|e2


4.
s1|-------------------|e1
     s2|--------|e2


5.
     s1|--------|e1
s2|-------------------|e2

如您所见,s1始终小于e2,而s2始终小于e1

当两条线不重叠时不是这种情况:

  
1.
s1|--------|e1
                 s2|--------|e2


2.
                 s1|--------|e1
s2|--------|e2

正如您在此处所见,s1大于e2s2大于e1

只要具有可比性,实际数据类型就完全不相关了。

答案 1 :(得分:0)

您可以执行以下操作:

SELECT count(*) FROM tablename 
WHERE :inputDate1 BETWEEN date1 AND date2 
OR :inputDate2 BETWEEN date1 AND date
OR date1 >= :inputDate1
OR date2 <= :inputDate2