删除 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
我被要求进行 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