删除 SQL Server 2008 中的重叠时间

Remove Overlap Time in SQL Server 2008

我被要求进行 sql 服务器查询,我需要在其中删除 重叠时间段服务票。就像我们有一项服务同时面临 3 个不同的问题。 table 的名称是 ticket,里面有 n 张票,我对其中的 3 张票很感兴趣,因为它们属于同一服务。

Ticket Number Start Time End Time 1 11:00 15:00 2 12:00 13:00 3 14:00 16:00

我需要一个查询来计算这些工单处于活动状态期间的总停机时间,即 6 小时 (11:00-16:00)。

怎么办?

如果您构建一个 table(或视图,或 UDF,或笛卡尔连接,或递归 CTE),以分钟级别的粒度在一天内生成所有 1440 次 {00:00..23: 59},您可以加入您的门票,并使用单独的分钟数来计算门票的持续时间。当涉及一组工单时,计算不同的分钟数,以避免在任何重叠范围内重复计算分钟数。

此示例假定(与您的示例数据一样)工单上的时间范围必须在同一日历日开始和结束,不会跨越午夜到另一天。如果一张工单可以跨越一个以上的日历日,那么您还需要包含所涉及日期的 table 或表达式,以便他们可以参与加入。

SELECT COUNT( DISTINCT t.ticketnumber ) AS ticketcount,
    COUNT( DISTINCT m.timeval ) AS  totalminutes
FROM ticketTbl t
INNER JOIN timeList m
ON t.startTime <= m.timeval
AND t.endTime > m.timeval
WHERE t.ticketnumber IN ( 1, 2, 3 )
;

您可以同时使用 DATEDIFF 和 SUM 函数:

SELECT DATEDIFF(HOUR, MIN([Start Time]),MAX([End Time]))AS [total downtime]  
FROM tblTicketTable 
WHERE [Ticket Number] = 1 OR [Ticket Number] = 2 OR [Ticket Number] = 3