【问题标题】:sql query to check if 2 events overlapssql查询检查2个事件是否重叠
【发布时间】:2015-09-28 11:04:13
【问题描述】:

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

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

或者,谈论积分器:

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

可能的无效记录:

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

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

【问题讨论】:

  • 你在使用什么 rdbms?

标签: mysql sql date overlap


【解决方案1】:

当(且仅当)第一个起点小于第二个终点,而第二个起点小于第一个终点时,任何 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

只要具有可比性,实际的数据类型完全无关紧要。

【讨论】:

  • 我不完全确定这个条件是否足够,请参阅问题描述中的更新
  • 数据类型无关紧要,只要它具有可比性。
  • 不错的答案,如果有伪代码就好了!
  • @Tobia 我几乎没有使用 MySql 的经验。我可以轻松编写一个 SQL Server 代码示例,但我认为这在这种情况下没有帮助。
【解决方案2】:

你可能会做这样的事情:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2015-04-24
    • 2023-03-23
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多