0

開始日と終了日のイベントのリストを含むテーブルがあります。次の方法で、今日発生しているイベントのリストを正常に取得できます。

SELECT * FROM event WHERE CURDATE() BETWEEN start_date and end_date

または、今日からちょうど1週間後に発生するイベントのリスト。

SELECT * FROM event WHERE DATE_ADD(CURDATE() INTERVAL 1 WEEK) BETWEEN start_date and end_date

しかし、今日から今日から1週間(両端を含む)の間に発生するイベントのリストが必要です。各イベントは複数日にわたっており、1日のイベントではなく、開始日と終了日によって定義されることに注意してください。

これをクエリする簡単な方法はありますか、それとも上記の最初のクエリを使用してPHPで毎日ループする方が簡単ですか(CURDATEを今日から1週間後の毎日に置き換えます)?

4

1 に答える 1

1

私はこのような問題を視覚化するのが好きです。私があなたの質問を理解している限り、返されるべきイベントには4つのタイプがあります。

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

1週間以内の日付で使用>=しました。<=このようにして、1週間の期間の開始または終了時に開始または終了するイベントも含まれるようにします。


これがすべての行に当てはまると仮定するとstart_date <= end_date、より簡単な方法は次のとおりです。

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