如何确定日期范围是否在另一个日期范围内的任何时间发生?

Sov*_*iut 6 database logic datetime

我有一个事件表,用于指定日期范围start_dateend_date字段.我有另一个在代码中指定的日期范围,它将当前周定义为'week_start'和'week_end'.

我想查询本周的所有活动.案件似乎是:

  • 活动在一周内开始和结束
  • 活动在一周之前开始,但在一周内结束
  • 活动在一周内开始,但在一周后结束
  • 活动在一周之前开始,也在一周之后结束
  • 不会驻留在内,也不会与周重叠的事件将被忽略

我试图提出一个可以处理所有这些情况的查询.到目前为止,我只能得到处理周重叠的案例,或完全内部的事件; 基本上,记录太多,或根本没有记录.

Qua*_*noi 21

(event.start BETWEEN week.start AND week.end)
OR
(week.start BETWEEN event.start AND event.end)
Run Code Online (Sandbox Code Playgroud)

简单来说,要么在活动期间开始一周,要么在一周内开始活动.

我们来检查一下:

活动在一周内开始和结束

该活动在一周内开始.

活动在一周之前开始,但在一周内结束

活动期间的一周开始.

活动在一周内开始,但在一周后结束

该活动在一周内开始.

活动在一周之前开始,也在一周之后结束

活动期间的一周开始.

请注意,BETWEEN上面的表达式仅用于简洁起见.

严格的表达式如下所示:

(event.start >= week.start AND event.start < week.end)
OR
(week.start >= event.start AND week.start < event.end)
Run Code Online (Sandbox Code Playgroud)

,如果week.endweek.start + INTERVAL 7 DAY.

I. e.如果你周开始Sun, 0:00:00,那么它应该结束next Sun, 0:00:00(不是Sat, 0:00:00)

此表达式看起来比常用的表达式更复杂:

event.start < week.end AND event.end > week.start
Run Code Online (Sandbox Code Playgroud)

,但前者更有效率和指数友好.

请参阅我的博客中的这些文章以进行性能比较: