【问题标题】:Query to check overlapping ranges in sql server?查询以检查sql server中的重叠范围?
【发布时间】:2018-10-08 16:10:25
【问题描述】:

我的桌子是

   From_Range      ToRange
   1                999
   9000             10000
   2000             5000

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您将上述条件与下图中的每个条形进行比较,则可以证明这是有效的:

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

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

    • 现有范围的开始日期总是在新范围的结束日期之前
    • 现有范围的结束日期晚于新范围的开始日期

    不重叠的那些未通过此测试中的一项或多项。

    【讨论】:

    • myValueLow = FromRange OR myValueHigh = FromRange ?哪个是正确的?
    • 您的第一个反映了我的答案,该图演示了如何测试条件。测试你的每一个建议作为练习,除非你发现我的答案有什么明显错误?
    【解决方案2】:

    这对我来说很好用

    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
     )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多