T-SQL查询两表时间区间重叠且name、room字段匹配的实现方案
T-SQL 区间匹配校验实现
核心逻辑说明
- 时间区间重叠判断采用通用反推公式:两个区间不重叠的唯一条件是「A的结束时间 < B的开始时间 或 B的结束时间 < A的开始时间」,对该条件取反即可覆盖所有重叠场景,无需嵌套判断:
init.date_from <= check.date_to AND check.date_from <= init.date_to - 额外匹配
name、room两个字段完全相等即可满足校验规则 - 采用
EXISTS关键字实现,匹配到符合条件的记录就直接返回结果,执行效率更高
实现代码
场景1:判断@check_table中是否存在任意符合条件的匹配记录,返回1/0
SELECT CASE WHEN EXISTS( SELECT 1 FROM @check_table c INNER JOIN @init_table i ON c.name = i.name AND c.room = i.room AND i.date_from <= c.date_to AND c.date_from <= i.date_to ) THEN 1 ELSE 0 END AS is_match
示例数据执行后返回1,表示存在匹配记录。
场景2:给@check_table每一行单独标记是否存在匹配
SELECT c.line_id, c.date_from, c.date_to, c.name, c.room, CASE WHEN EXISTS( SELECT 1 FROM @init_table i WHERE i.name = c.name AND i.room = c.room AND i.date_from <= c.date_to AND c.date_from <= i.date_to ) THEN 1 ELSE 0 END AS is_match FROM @check_table c
内容的提问来源于stack exchange,提问作者Ramzes
相关产品推荐
相关产品推荐

