使用SQL Server中的重叠日期时间对“屏蔽的”日期时间范围求和

时间:2013-09-25 05:10:11

标签: sql sql-server-2008-r2 sum datediff

我无法在重叠日期时间内总结日期差异(以分钟为单位),使用第二组日期时间作为“掩码”的更多内容。

我有什么

我的表格看起来像这样:

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。

1 个答案:

答案 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