如何从给定的一组日期范围中找到重叠的(常见日期范围)?
下表包含事件和程序(EID
和PID
分别)
CREATE TABLE #EventsTBL
(
PID INT,
EID INT,
StartDate DATETIME,
EndDate DATETIME
);
以下插入语句设置示例数据
INSERT INTO #EventsTBL
VALUES
(13579, 1, N'2018-01-01T00:00:00', N'2019-03-31T00:00:00'),
(13579, 2, N'2018-02-01T00:00:00', N'2018-05-31T00:00:00'),
(13579, 2, N'2018-07-01T00:00:00', N'2019-01-31T00:00:00'),
(13579, 7, N'2018-03-01T00:00:00', N'2019-03-31T00:00:00'),
(13579, 5, N'2018-02-01T00:00:00', N'2018-04-30T00:00:00'),
(13579, 5, N'2018-10-01T00:00:00', N'2019-03-31T00:00:00'),
(13579, 8, N'2018-01-01T00:00:00', N'2018-04-30T00:00:00'),
(13579, 8, N'2018-06-01T00:00:00', N'2018-12-31T00:00:00'),
(13579, 13, N'2018-01-01T00:00:00', N'2019-03-31T00:00:00'),
(13579, 6, N'2018-04-01T00:00:00', N'2018-05-31T00:00:00'),
(13579, 6, N'2018-09-01T00:00:00', N'2018-11-30T00:00:00'),
(13579, 4, N'2018-02-01T00:00:00', N'2019-01-31T00:00:00'),
(13579, 19, N'2018-03-01T00:00:00', N'2018-07-31T00:00:00'),
(13579, 19, N'2018-10-01T00:00:00', N'2019-02-28T00:00:00'),
--
(13570, 16, N'2018-02-01T00:00:00', N'2018-06-30T00:00:00'),
(13570, 16, N'2018-08-01T00:00:00', N'2018-08-31T00:00:00'),
(13570, 16, N'2018-10-01T00:00:00', N'2019-02-28T00:00:00'),
(13570, 23, N'2018-03-01T00:00:00', N'2018-06-30T00:00:00'),
(13570, 23, N'2018-11-01T00:00:00', N'2019-01-31T00:00:00');
该程序PID=13570
只有两种不同的事件类型和 5 个事件会话。我需要知道事件 16 和 23 都为此活动的时间段PID
。
+-------+------------+------------+
| PID | StartDate | EndDate |
+-------+------------+------------+
| 13570 | 2018-03-01 | 2018-06-30 |
| 13570 | 2018-11-01 | 2019-01-31 |
+-------+------------+------------+
同样对于PID = 13579
. - 这需要处理更多的事件类型,但我仍然需要知道该程序的所有事件同时运行的时间范围。
+-------+------------+------------+
| PID | StartDate | EndDate |
+-------+------------+------------+
| 13579 | 2018-04-01 | 2018-04-30 |
| 13579 | 2018-10-01 | 2018-11-30 |
+-------+------------+------------+
如果解释不清楚,请参见下图
遵循以下几行的内容应该可以满足您的需要(DEMO)
我提出了一个 T-SQL 的解决方案。
小提琴 SQL Server 2017
小提琴 SQL Server 2017 ALT#1
问题:
按程序查找所有可用事件的会话都处于活动状态的日期范围交叉点。
解决方案:
下面我分三个步骤解释如何确定交叉点,交叉点的并发性和程序的最大并发性。
第 1 步:查询一组连续的日期间隔,这些日期间隔由会话开始或停止的程序分区。
步骤2:查询并发(程序同时运行的不同事件数)等于最大并发(程序可用的不同事件总数)的相关日期范围。
第三步:输出达到最大并发的日期范围
完整查询: