0

パラメータとして指定された開始日と終了日の間にあるイベントを取得する次のクエリがあります。

SELECT * FROM events
WHERE (startDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME)
OR endDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME))

これは、開始時刻と終了時刻が重なっているイベントを取得する場合には問題なく機能しますが、これらの時刻の間に完全にカプセル化されたイベントは取得できません。写真はこれをより明確にするかもしれません:

Event A |------------------------------------------------------------------| Event B ----------------------|------------|-------------------------------

Where | represents a start or end date

私の図では、イベント B の開始時間と終了時間でクエリを使用すると、イベント A は取得されません。

重複してカプセル化されたすべてのイベントを表示するようにクエリを変更するにはどうすればよいですか?

4

2 に答える 2

2
SELECT * FROM events
WHERE (startDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME)
OR endDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME))
OR (endDate >= CAST(@end AS DATETIME)) AND startDate <= CAST(@end AS DATETIME))

最後のOR行は、start が end パラメータより小さく、end がそれより大きいすべての行を追加します。そうすれば、@end と重なるすべての行が一致します。あなたも試すことができます:

SELECT * FROM events
WHERE 
 (startDate <= CAST(@start AS DATETIME)) AND endDate >= CAST(@start AS DATETIME))
OR (endDate >= CAST(@end AS DATETIME)) AND startDate <= CAST(@end AS DATETIME))

それはあなたが望むすべてのものと一致するはずです。startまたはに重なるすべてのレコードに一致しendます。囲まれているすべてのものにも一致させたい場合、startまたはendそれらのいずれにも重ならないようにする場合は、おそらくそれを between と組み合わせる必要があります。

于 2013-05-20T19:15:07.147 に答える
1

あなたがしなければなりません

SELECT * FROM events
WHERE (startDate <= CAST(@end AS DATETIME) AND endDate >= CAST(@start AS DATETIME)
于 2013-05-20T19:13:53.527 に答える