我有一个事件表,指定日期范围start_date
and end_date
字段。我有另一个在代码中指定的日期范围,它将当前周定义为“week_start”和“week_end”。
我想查询本周的所有活动。这些案例似乎是:
- 活动在一周内开始和结束
- 活动在本周之前开始,但在本周内结束
- 活动在一周内开始,但在一周后结束
- 活动在周前开始,也在周后结束
- 既不在一周内也不与一周重叠的事件将被忽略
我正在尝试提出一个可以处理所有这些情况的查询。到目前为止,我只能得到处理每周重叠的案例,或者完全内部的事件;本质上,记录太多,或者根本没有。
(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.end
is a week.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
,但前者更高效且索引友好。
请参阅我的博客中的这些文章以进行性能比较:
- 重叠范围:SQL Server http://explainextended.com/2009/06/30/overlapping-ranges-sql-server/
- 重叠范围:MySQL http://explainextended.com/2009/07/01/overlapping-ranges-mysql/
- 重叠范围:Oracle http://explainextended.com/2009/07/02/overlapping-ranges-oracle/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)