SQL时间区间匹配:按表B时间区间拆分表A重叠时间段
时间区间重叠拆分SQL实现方案
实现逻辑
两个时间区间存在有效重叠的标准判断条件为:B.StartTime < A.EndTime AND B.EndTime > A.StartTime,满足该条件时,重叠区间的取值规则为:
- 重叠起始时间:取A、B两个区间起始时间的较大值
- 重叠结束时间:取A、B两个区间结束时间的较小值
按照上述规则计算即可直接得到符合需求的拆分结果。
实现代码
以下为适配SQL Server(匹配你提供的临时表语法)的实现代码:
SELECT IIF(A.StartTime > B.StartTime, A.StartTime, B.StartTime) AS StartTime, IIF(A.EndTime < B.EndTime, A.EndTime, B.EndTime) AS EndTime FROM #A A INNER JOIN #B B ON B.StartTime < A.EndTime AND B.EndTime > A.StartTime
兼容多数据库的通用写法(支持
GREATEST/LEAST函数的数据库如MySQL、PostgreSQL等可直接使用):SELECT GREATEST(A.StartTime, B.StartTime) AS StartTime, LEAST(A.EndTime, B.EndTime) AS EndTime FROM A JOIN B ON B.StartTime < A.EndTime AND B.EndTime > A.StartTime
输出结果
执行上述代码后将得到你预期的两条重叠区间:
| StartTime | EndTime |
|---|---|
| 2021-01-01 07:15:00 | 2021-01-01 07:32:00 |
| 2021-01-01 07:45:00 | 2021-01-01 09:15:00 |
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

