我喜欢想象这样的问题。据我了解您的问题,应该返回四种类型的事件:
|-------------------- WEEK ---------------------|
| |
| |========== EVENT ==========| |
|========== EVENT ==========| |
| |========== EVENT ==========|
|========================= EVENT =========================|
| |
|-----------------------------------------------|
这意味着我们有:
- 在一周内开始和结束的事件;
- 在一周前开始并在一周内结束的事件;
- 在一周内开始并在一周后结束的事件;
- 在一周之前开始并在一周之后结束的事件。
将其翻译成 SQL 会得到以下结果:
SELECT *
FROM events
WHERE (start_date >= CURDATE() AND end_date <= CURDATE() + INTERVAL 1 WEEK)
OR (start_date < CURDATE() AND end_date >= CURDATE() )
OR (start_date <= CURDATE() + INTERVAL 1 WEEK
AND end_date > CURDATE() + INTERVAL 1 WEEK)
OR (start_date < CURDATE() AND end_date > CURDATE() + INTERVAL 1 WEEK);
我使用>=
and<=
表示一周内的日期。这样,我们可以确保在一周开始或结束时开始或结束的事件也包括在内。
假设start_date <= end_date
所有行都是如此,更简单的方法是:
SELECT *
FROM events
WHERE start_date <= CURDATE() + INTERVAL 1 WEEK
AND CURDATE() <= end_date