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

Kun*_*esh 6 sql sql-server sql-server-2008

我有我的桌子

   From_Range      ToRange
   1                999
   9000             10000
   2000             5000
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*s J 21

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

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

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

Existing range:         |-------------------|
Overlaps:       |-------------|       |------------|
                |----------------------------------|
                           |-------------|
Not overlaps:   |-----|                       |----|
Run Code Online (Sandbox Code Playgroud)

在所有重叠的情况下,这两个测试都是正确的:

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

那些不重叠的那个不能通过这个测试中的一个或另一个.