私はこのような問題を視覚化するのが好きです。私があなたの質問を理解している限り、返されるべきイベントには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