0

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

我有的

我的表可能看起来像这样:

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。

4

1 回答 1

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
于 2013-09-25T07:51:36.537 回答