根据开始日期和结束日期查询从今天到今天一周之间发生的多日事件列表

时间:2012-04-23 23:25:51

标签: php mysql

我有一个表格,其中包含一个包含开始日期和结束日期的事件列表。我可以通过以下方式成功获取今天发生的事件列表:

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)?

1 个答案:

答案 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