database - 如何确定一个日期范围是否出现在另一个日期范围内的任何时间?

标签 database datetime logic

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

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

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

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

最佳答案

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

简单来说,要么一周在事件期间开始,要么事件在一周内开始。

让我们检查一下:

Event begins and ends within the week

事件在本周开始。

Event begins before the week, but ends within the week

一周从事件期间开始。

Event begins within the week, but ends after the week

事件在本周开始。

Event begins before the week and also ends after the week

一周从事件期间开始。

请注意,在上面的表达式中使用 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

我。 e.如果您的一周开始于 Sun, 0:00:00,那么它应该在 下一个 Sun, 0:00:00 结束(而不是在 Sat, 0: 00:00)

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

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

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

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

关于database - 如何确定一个日期范围是否出现在另一个日期范围内的任何时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/730722/

相关文章:

php - 在PHP中使用SHA1登录表单

database - Azure 托管实例找不到存储过程 'sys.sp_MS_marksystemobject'

datetime - 使用 Java 8 到天花板的圆形分钟

c# - 检索系统日期

PHP异常捕获和编程逻辑

java连接不上mysql数据库

mysql - 合并来自同一来源的两个计数查询

c# - 为什么这个日期解析在 C# .net 1.1 中不起作用?

Java 对 Tic Tac Toe 程序没有意义

algorithm - DPLL 和满意度示例?