我有一个表格,其中包含一个包含开始日期和结束日期的事件列表。我可以通过以下方式成功获取今天发生的事件列表:
SELECT * FROM event WHERE CURDATE() BETWEEN start_date and end_date
或者从今天起一周内发生的事件列表,包括以下内容:
SELECT * FROM event WHERE DATE_ADD(CURDATE() INTERVAL 1 WEEK) BETWEEN start_date and end_date
但是,我想要从今天到今天(包括)之间的任何时间发生的事件列表。请记住,每个事件跨越多天,并由开始日期和结束日期定义,而不是单日事件。
有没有一种简单的方法来查询这个问题,或者使用上面的第一个查询在PHP中每天循环一次是否更容易(从今天到现在的一周内每天替换CURDATE)?
答案 0 :(得分:1)
我喜欢想象这样的问题。据我了解你的问题,应该返回四种类型的事件:
|-------------------- 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);
我使用>=
和<=
表示一周内的日期。这样我们就可以确保包含在一周期间开始或结束时开始或结束的事件。
假设start_date <= end_date
对所有行都为真,则更简单的方法是:
SELECT *
FROM events
WHERE start_date <= CURDATE() + INTERVAL 1 WEEK
AND CURDATE() <= end_date