sql 查询以检查 2 个事件是否重叠
sql query to check if 2 events overlaps
我的 table 有 3 列名称,start_date 和 end_date
仅当新事件的日期不与现有事件重叠时,我才需要在 table 中插入一条记录。
所以,假设我有一个开始日期为 1/1/2015 和结束日期为 31/12/2015 的活动
如果有这样的日期,我无法插入事件:
- 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 个范围重叠。
因此,您要测试您的传入记录的开始日期和结束日期与 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
大于 e2
或 s2
大于 e1
。
实际的数据类型是完全无关紧要的,只要它是可比较的。
你可能会这样做:
SELECT count(*) FROM tablename
WHERE :inputDate1 BETWEEN date1 AND date2
OR :inputDate2 BETWEEN date1 AND date
OR date1 >= :inputDate1
OR date2 <= :inputDate2
我的 table 有 3 列名称,start_date 和 end_date 仅当新事件的日期不与现有事件重叠时,我才需要在 table 中插入一条记录。 所以,假设我有一个开始日期为 1/1/2015 和结束日期为 31/12/2015 的活动 如果有这样的日期,我无法插入事件:
- 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 个范围重叠。
因此,您要测试您的传入记录的开始日期和结束日期与 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
大于 e2
或 s2
大于 e1
。
实际的数据类型是完全无关紧要的,只要它是可比较的。
你可能会这样做:
SELECT count(*) FROM tablename
WHERE :inputDate1 BETWEEN date1 AND date2
OR :inputDate2 BETWEEN date1 AND date
OR date1 >= :inputDate1
OR date2 <= :inputDate2