【发布时间】:2019-01-17 16:45:34
【问题描述】:
如何从一组给定的日期范围中找到重叠(共同)的日期范围?
考虑到特定程序 (PID) 的所有事件 (EID),需要找到重叠(常见)日期范围。
示例:程序 (PID=13579) 有两个事件日期范围 (EID=2)。
之前发表于link
我已经在这里检查过(但没用):Link
示例架构和数据:
CREATE TABLE #EventsTBL
(
PID INT,
EID INT,
StartDate DATETIME,
EndDate DATETIME
);
INSERT INTO #EventsTBL
VALUES
(13579, '1', '01 Jan 2018', '31 Mar 2019'),
(13579, '2', '01 Feb 2018', '31 May 2018'),
(13579, '2', '01 Jul 2018', '31 Jan 2019'),
(13579, '7', '01 Mar 2018', '31 Mar 2019'),
(13579, '5', '01 Feb 2018', '30 Apr 2018'),
(13579, '5', '01 Oct 2018', '31 Mar 2019'),
(13579, '8', '01 Jan 2018', '30 Apr 2018'),
(13579, '8', '01 Jun 2018', '31 Dec 2018'),
(13579, '13', '01 Jan 2018', '31 Mar 2019'),
(13579, '6', '01 Apr 2018', '31 May 2018'),
(13579, '6', '01 Sep 2018', '30 Nov 2018'),
(13579, '4', '01 Feb 2018', '31 Jan 2019'),
(13579, '19', '01 Mar 2018', '31 Jul 2018'),
(13579, '19', '01 Oct 2018', '28 Feb 2019'),
--
(13570, '16', '01 Feb 2018', '30 Jun 2018'),
(13570, '16', '01 Aug 2018', '31 Aug 2018'),
(13570, '16', '01 Oct 2018', '28 Feb 2019'),
(13570, '23', '01 Mar 2018', '30 Jun 2018'),
(13570, '23', '01 Nov 2018', '31 Jan 2019');
输出应该是:
PID StartDate EndDate
13579 01-Apr-2018 30-Apr-2018
13579 01-Oct-2018 30-Nov-2018
13570 01-Mar-2018 30-Jun-2018
13570 01-Nov-2018 31-Jan-2019
【问题讨论】:
-
将预期结果发布为文本总是更好:) 不过你的第一个问题做得很好!为什么马丁的回答不够?
-
我看不出确定它们是否重叠的规则是什么。许多日期范围相互重叠,但突出显示的日期范围与更多但不是所有情况重叠 - 那么它是如何决定的?
-
所以一个日期必须在 PID 的所有 EID 中至少出现一次?
-
13570 有道理,我看到了重叠 - 13579 充满了未报告的重叠
-
需要找到特定 ProgramID (PID) 的所有 EventsID (EID) 的日期范围重叠(常见)。!例如,第 2 行没有从 oct'18 到 nov'18 的范围,但相同的 eventid(eid=2) 有另一个范围(第 3 行)从 jul'18 到 jan'19,其中包括 oct'18 , 18 年 11 月。所以在这里,第 2 行和第 3 行属于 eid(eventid) = 2。这意味着事件 2 的共同日期范围是 oct'18 和 nov'18。希望这很清楚。
标签: sql sql-server overlap gaps-and-islands