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

sql query to check if 2 events overlaps

我的 table 有 3 列名称,start_date 和 end_date 仅当新事件的日期不与现有事件重叠时,我才需要在 table 中插入一条记录。 所以,假设我有一个开始日期为 1/1/2015 和结束日期为 31/12/2015 的活动 如果有这样的日期,我无法插入事件:

或者,谈论积分器:

可能的无效记录:

匹配此条件的较短表达式是什么?

当(且仅当)第一个起点小于第二个终点,而第二个起点小于第一个终点时,任何 2 个范围重叠。

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

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

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

实际的数据类型是完全无关紧要的,只要它是可比较的。

你可能会这样做:

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