【发布时间】:2017-03-17 22:43:35
【问题描述】:
我有一个包含以下数据的表(按 StartDate 排序):
| Id | StartDate | EndDate |
|----|---------------------|---------------------|
| 1 | 2017-03-18 00:00:00 | 2017-03-18 02:00:00 |
| 2 | 2017-03-18 01:30:00 | 2017-03-18 04:00:00 |
| 3 | 2017-03-18 01:45:00 | 2017-03-18 03:00:00 |
| 4 | 2017-03-18 02:10:00 | 2017-03-18 02:30:00 |
| 5 | 2017-03-18 02:35:00 | 2017-03-18 02:50:00 |
| 6 | 2017-03-18 03:20:00 | 2017-03-18 03:50:00 |
| 7 | 2017-03-18 05:00:00 | 2017-03-18 05:30:00 |
| 8 | 2017-03-18 05:10:00 | 2017-03-18 07:00:00 |
| 9 | 2017-03-18 05:50:00 | 2017-03-18 08:00:00 |
过滤逻辑: 在第一段日期之后,我们发现另一个与它不相交的日期。 然后针对找到的周期重复该逻辑。
过滤后应保留:
| Id | StartDate | EndDate |
|----|---------------------|---------------------|
| 1 | 2017-03-18 00:00:00 | 2017-03-18 02:00:00 |
| 4 | 2017-03-18 02:10:00 | 2017-03-18 02:30:00 |
| 5 | 2017-03-18 02:35:00 | 2017-03-18 02:50:00 |
| 6 | 2017-03-18 03:20:00 | 2017-03-18 03:50:00 |
| 7 | 2017-03-18 05:00:00 | 2017-03-18 05:30:00 |
| 9 | 2017-03-18 05:50:00 | 2017-03-18 08:00:00 |
是否可以在不使用 CURSOR 的情况下实现这一点?
为了方便使用记录:
CREATE TABLE #Dates (Id INT, StartDate DATETIME, EndDate DATETIME);
INSERT INTO #Dates SELECT 1, '2017-03-18 00:00:00', '2017-03-18 02:00:00';
INSERT INTO #Dates SELECT 2, '2017-03-18 01:30:00', '2017-03-18 04:00:00';
INSERT INTO #Dates SELECT 3, '2017-03-18 01:45:00', '2017-03-18 03:00:00';
INSERT INTO #Dates SELECT 4, '2017-03-18 02:10:00', '2017-03-18 02:30:00';
INSERT INTO #Dates SELECT 5, '2017-03-18 02:35:00', '2017-03-18 02:50:00';
INSERT INTO #Dates SELECT 6, '2017-03-18 03:20:00', '2017-03-18 03:50:00';
INSERT INTO #Dates SELECT 7, '2017-03-18 05:00:00', '2017-03-18 05:30:00';
INSERT INTO #Dates SELECT 8, '2017-03-18 05:10:00', '2017-03-18 07:00:00';
INSERT INTO #Dates SELECT 9, '2017-03-18 05:50:00', '2017-03-18 08:00:00';
DROP TABLE #Dates;
【问题讨论】:
-
你使用的sql-server是什么版本的?
-
我使用 MSSQL Server 2014
-
你可以使用
LAG函数来实现这个,查看我的答案了解更多详情 -
@IvanAntonov 感谢您提供示例数据 - 让每个人都更轻松。
标签: sql sql-server tsql intervals date-range