查询以检查sql server中的重叠范围?

时间:2012-06-13 09:36:37

标签: sql sql-server sql-server-2008

我的桌子是

   From_Range      ToRange
   1                999
   9000             10000
   2000             5000

当我尝试插入范围值1000 - 3000时,它应该失败,因为这个新范围内的某些值落在现有范围2000 - 5000之间。如何检查输入范围是否在现有范围内?

2 个答案:

答案 0 :(得分:19)

找到重叠的最简单方法是:

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

如果您将上述条件与下图中的每个条形图进行比较,则可以显示此信息:

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

在所有重叠案例中,这两项测试都是正确的:

  • 现有范围的开始日期始终位于新范围的结束日期之前
  • 现有范围的结束日期位于新范围的开始日期之后

那些没有重叠的人不能通过这个测试中的一个或另一个。

答案 1 :(得分: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
 )
)