7

私は自分のテーブルを次のように持っています

   From_Range      ToRange
   1                999
   9000             10000
   2000             5000

範囲値 1000 ~ 3000 を挿入しようとすると、この新しい範囲内の一部の値が既存の範囲 2000 ~ 5000 の間にあるため、失敗するはずです。入力範囲が既存の範囲内にあるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

26

オーバーラップを見つける最も簡単な方法は次のとおりです。

IF EXISTS (SELECT 1 FROM table WHERE @myValueLo <= ExistingRangeEnd AND @myValueHi >= ExistingRangeStart)
  -- Overlaps
ELSE
  -- Doesn't overlap

上記の条件を下の図の各バーと比較すると、これが機能することがわかります。

Existing range:         |-------------------|
Overlaps:       |-------------|       |------------|
                |----------------------------------|
                           |-------------|
Not overlaps:   |-----|                       |----|

すべてのオーバーラップのケースで、これらのテストはどちらも真です。

  • 既存の範囲の開始日は、常に新しい範囲の終了日より前です
  • 既存の範囲の終了日が新しい範囲の開始日より後です

重複していないものは、このテストのいずれかに失敗します。

于 2012-06-13T09:48:40.690 に答える
0

これは私にとってはうまくいきます

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
 )
)
于 2014-07-17T09:43:50.710 に答える