6

start_date我有一个事件表,它用和end_date字段指定日期范围。我有另一个日期范围,在代码中指定,将当前周定义为“week_start”和“week_end”。

我想查询本周的所有事件。这些案例似乎是:

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

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

4

5 回答 5

22
(event.start BETWEEN week.start AND week.end)
OR
(week.start BETWEEN event.start AND event.end)

简而言之,要么在活动期间开始一周,要么在一周内开始活动。

让我们检查一下:

活动在一周内开始和结束

活动在一周内开始。

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

一周在活动期间开始。

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

活动在一周内开始。

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

一周在活动期间开始。

请注意,BETWEEN上面的表达式只是为了简洁起见。

严格的表达式如下所示:

(event.start >= week.start AND event.start < week.end)
OR
(week.start >= event.start AND week.start < event.end)

, 前提week.endweek.start + INTERVAL 7 DAY.

IE。如果您的一周开始于Sun, 0:00:00,那么它应该结束于next Sun, 0:00:00(而不是Sat, 0:00:00

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

event.start < week.end AND event.end > week.start

,但前者更高效且索引友好。

有关性能比较,请参阅我的博客中的这些文章:

于 2009-04-08T16:17:31.637 回答
3

你可以这样写你的条件:

start_date <= week_end AND end_date >= week_start

编辑:这假设 start_date <= end_date 和 week_start <= week_end (正确排序)并且由于不使用 OR (这在某些数据库上可能会产生性能问题)为您提供大多数数据库实现的最佳性能

Edit2:此解决方案还解决了在间隔之前开始并在间隔之后结束的事件的问题。

于 2009-04-08T16:18:14.207 回答
2

为流行的 Catalin +1,但可惜我没有投票权。

您想要的限制条件只是表达 Allen 的“OVERLAPS”运算符的标准方式。

附加 SQL 警告:如果 end_date 可以为空,请务必将这些列中的空值视为“时间结束”。

额外的功能警告:确保使用 '<=' 与 '<' 来适应记录的时间段是否包括结束日期。

于 2009-06-18T16:21:52.823 回答
0

为了...

where start_date >= week_start and end_date <= week_end
where start_date <= week_start and end_date >= week_start and end_date <= week_end
where start_date >= week_start and start_date <= week_end and end_date > week_end
where start_date < week_start and end_date > week_end
于 2009-04-08T16:18:33.317 回答
0

(end2 >= start1) && (start2 <= end1) 我认为对于任何相交的日期范围都会返回 true。

我在这里找到了一个关于这个的讨论,我觉得很有用。

于 2009-04-08T16:18:39.370 回答