【发布时间】:2019-02-22 08:03:44
【问题描述】:
如何检查一个范围是否被一组范围完全覆盖。在以下示例中:
WITH ranges(id, a, b) AS (
SELECT 1, 0, 40 UNION
SELECT 2, 40, 60 UNION
SELECT 3, 80, 100 UNION
SELECT 4, 10, 30
), tests(id, a, b) AS (
SELECT 1, 10, 90 UNION
SELECT 2, 10, 60
)
SELECT *
FROM tests
WHERE -- ?
- 我想选择
10, 60,因为它都被0, 40和40, 60(和10, 30)覆盖了 - 我想排除
10, 90,因为它暴露在60, 80之间
假设a 是包容性的,b 是独占性的,即值40 属于[40, 60) 而不是[0, 40)。范围可以包含间隙和各种重叠。
实际问题涉及日期+时间数据,但日期只是数字。我正在使用 SQL Server,但首选通用解决方案。
【问题讨论】:
-
看起来您在这里使用的是封闭间隔。请注意,尤其是对于日期时间数据,应首选半封闭区间。计算端点更容易,您不太可能跳过应该包含的数据等。
标签: sql sql-server date range gaps-and-islands