CHECKは後に実行されます 行が挿入されているため、範囲がそれ自体と重複しています。
WHEREを修正して、次のようなものを含める必要があります:@MyTableId <> MyTableId
。
ところで、WHERE式は単純化できます。
範囲しない 次の場合に重複:
- 一方の範囲の終了は、もう一方の範囲の開始前です
- または 一方の範囲の開始は、もう一方の範囲の終了後です。
これは次のようにSQLで記述できます:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
それを否定して、実行する範囲を取得します オーバーラップ...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...ドモルガンの法則によれば、これは...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...これは次と同じです:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
したがって、最終的なWHEREは次のようになります。
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQLフィドル]
注:範囲を「タッチ」できるようにするには、<=
を使用します 開始式で、>
を生成します 最終的な表現で。