我无法在重叠日期时间内总结日期差异(以分钟为单位),使用第二组日期时间作为“掩码”的更多内容。
我有什么
我的表格看起来像这样:
ID StartDateTime EndDateTime Type
1 9-16-2013 12:00:00 9-16-2013 16:00:00 A
2 9-16-2013 12:00:00 9-16-2013 13:00:00 A
3 9-16-2013 14:00:00 9-16-2013 15:00:00 A
4 9-16-2013 12:00:00 9-16-2013 13:00:00 C
5 9-16-2013 14:00:00 9-16-2013 17:00:00 C
视觉时间表如下所示:
12 13 14 15 16 17
A |-------------------------------| (ID 1)
A |-------| |-------| (IDs 2 and 3)
C |-------| |-----------------------|
我需要什么
我需要做的是仅在类型B时对类型A进行求和。因此,我想要生成和求和的集合(包括ID以供参考):
ID StartDateTime EndDateTime
1 9-16-2013 12:00:00 9-16-2013 13:00:00
1 9-16-2013 14:00:00 9-16-2013 16:00:00
2 9-16-2013 12:00:00 9-16-2013 13:00:00
3 9-16-2013 14:00:00 9-16-2013 15:00:00
新的“蒙面”时间表如下所示:
12 13 14 15 16 17
A |-------| |---------------| (ID 1)
A |-------| |-------| (ID 2 and 3)
我遇到的问题是将第一个ID拆分为2个不同的记录,因为C类中断了。我已经查看了这个站点上的很多重叠帖子,但似乎都没有解决这个特殊需求。任何帮助将不胜感激。如果您需要更多信息或我能以任何方式更清楚,请告诉我。我正在使用SQL Server 2008 R2。
答案 0 :(得分:1)
一种可能的解决方案:
--set up test data
DECLARE @t TABLE
(ID INT,StartDateTime DATETIME,EndDateTime DATETIME,[Type] CHAR(1))
INSERT @t
(ID,StartDateTime,EndDateTime,[Type])
VALUES
(1,'9-16-2013 12:00:00','9-16-2013 16:00:00','A'),
(2,'9-16-2013 12:00:00','9-16-2013 13:00:00','A'),
(3,'9-16-2013 14:00:00','9-16-2013 15:00:00','A'),
(4,'9-16-2013 12:00:00','9-16-2013 13:00:00','C'),
(5,'9-16-2013 14:00:00','9-16-2013 17:00:00','C')
-- solution
SELECT a.Id,
CASE WHEN a.StartDateTime < c.StartDateTime THEN c.StartDateTime ELSE a.StartDateTime END AS StartDateTime,
CASE WHEN a.EndDateTime < c.EndDateTime THEN a.EndDateTime ELSE c.EndDateTime END AS EndDateTime,
a.[Type]
FROM (SELECT * FROM @t WHERE [Type] = 'A') AS a
JOIN (SELECT * FROM @t WHERE [Type] = 'C') AS c
ON c.StartDateTime < a.EndDateTime
AND c.EndDateTime > a.StartDateTime
ORDER BY a.Id, a.StartDateTime