私は自分のテーブルを次のように持っています
From_Range ToRange
1 999
9000 10000
2000 5000
範囲値 1000 ~ 3000 を挿入しようとすると、この新しい範囲内の一部の値が既存の範囲 2000 ~ 5000 の間にあるため、失敗するはずです。入力範囲が既存の範囲内にあるかどうかを確認するにはどうすればよいですか?
私は自分のテーブルを次のように持っています
From_Range ToRange
1 999
9000 10000
2000 5000
範囲値 1000 ~ 3000 を挿入しようとすると、この新しい範囲内の一部の値が既存の範囲 2000 ~ 5000 の間にあるため、失敗するはずです。入力範囲が既存の範囲内にあるかどうかを確認するにはどうすればよいですか?
オーバーラップを見つける最も簡単な方法は次のとおりです。
IF EXISTS (SELECT 1 FROM table WHERE @myValueLo <= ExistingRangeEnd AND @myValueHi >= ExistingRangeStart)
-- Overlaps
ELSE
-- Doesn't overlap
上記の条件を下の図の各バーと比較すると、これが機能することがわかります。
Existing range: |-------------------|
Overlaps: |-------------| |------------|
|----------------------------------|
|-------------|
Not overlaps: |-----| |----|
すべてのオーバーラップのケースで、これらのテストはどちらも真です。
重複していないものは、このテストのいずれかに失敗します。
これは私にとってはうまくいきます
DECLARE @From Decimal = 2000
DECLARE @TO Decimal =5000
SELECT COUNT(ID)
FROM TABLENAME
WHERE
(
(
@From BETWEEN OPEN_HRS AND (CLOSE_HRS - 1)
OR
@TO BETWEEN (OPEN_HRS + 1) AND CLOSE_HRS
)
OR
(
OPEN_HRS BETWEEN @From AND (@TO - 1)
OR
CLOSE_HRS BETWEEN (@From + 1) AND @TO
)
)