0

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

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

4

1 回答 1

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

我使用>=and<=表示一周内的日期。这样,我们可以确保在一周开始或结束时开始或结束的事件也包括在内。


假设start_date <= end_date所有行都是如此,更简单的方法是:

SELECT *
FROM events
WHERE start_date <= CURDATE() + INTERVAL 1 WEEK 
  AND CURDATE() <= end_date 
于 2012-04-23T23:46:42.320 回答