6

フィールドと日付範囲を指定するイベント テーブルがstart_dateありend_dateます。現在の週を「week_start」と「week_end」として定義するコードで指定された別の日付範囲があります。

その週のすべてのイベントを照会したいと思います。ケースは次のようです。

  • イベントはその週に開始および終了します
  • イベントは週の前に開始されますが、週内に終了します
  • イベントは 1 週間以内に始まり、1 週間後に終了します
  • イベントは週の前に開始し、週の後に終了します
  • 週内に存在せず、まったく重なっていないイベントは無視されます

これらすべてのケースを処理できるクエリを考え出そうとしています。これまでのところ、週の重複を処理するケース、または完全に内部的なイベントしか取得できませんでした。基本的に、レコードが多すぎるか、まったくレコードがありません。

4

5 に答える 5

22
(event.start BETWEEN week.start AND week.end)
OR
(week.start BETWEEN event.start AND event.end)

簡単に言えば、イベント中に週が始まるか、週中にイベントが始まります。

確認しましょう:

イベントはその週に開始および終了します

イベントは週に始まります。

イベントは週の前に開始されますが、週内に終了します

週はイベント中に始まります。

イベントは 1 週間以内に始まり、1 週間後に終了します

イベントは週に始まります。

イベントは週の前に開始し、週の後に終了します

週はイベント中に始まります。

BETWEEN上記の式は、簡潔にするために使用されていることに注意してください。

厳密な表現は次のようになります。

(event.start >= week.start AND event.start < week.end)
OR
(week.start >= event.start AND week.start < event.end)

、 でweek.endある場合week.start + INTERVAL 7 DAY

私はe。週の開始Sun, 0:00:00日が の場合、終了日はnext Sun, 0:00:00( ではなくSat, 0:00:00)です。

この式は、一般的に使用されるものよりも複雑に見えます。

event.start < week.end AND event.end > week.start

ですが、前者の方が効率的でインデックスに適しています。

パフォーマンスの比較については、私のブログの次の記事を参照してください。

于 2009-04-08T16:17:31.637 に答える
3

次のように条件を記述できます。

start_date <= week_end AND end_date >= week_start

編集: これは、start_date <= end_date および week_start <= week_end (適切に順序付けられている) を想定しており、OR を使用していないため、ほとんどの db 実装で最高のパフォーマンスが得られます (一部のデータベースではパフォーマンスの問題が発生する可能性があります)。

Edit2: このソリューションは、間隔の前に始まり、間隔の後に終了するイベントの問題も解決します。

于 2009-04-08T16:18:14.207 に答える
2

ポップカタリンの場合は+1ですが、残念ながら私には投票権がありません。

必要な制限条件は、Allenの「OVERLAPS」演算子を表現するための標準的な方法です。

追加のSQL警告:end_dateがnull許容の場合は、これらの列のnullを「時間の終わり」として扱うようにしてください。

追加の機能上の注意:記録された期間に終了日が含まれるかどうかに応じて、「<=」と「<」の使用法を調整してください。

于 2009-06-18T16:21:52.823 に答える
0

順番に...

where start_date >= week_start and end_date <= week_end
where start_date <= week_start and end_date >= week_start and end_date <= week_end
where start_date >= week_start and start_date <= week_end and end_date > week_end
where start_date < week_start and end_date > week_end
于 2009-04-08T16:18:33.317 に答える