如何编写SQL查询来计算聚合服务器的正常运行时间?

时间:2016-05-09 14:15:54

标签: sql sql-server

我在SQL中有一个要求,我每天都有服务器启动停止时间的数据,为期一个月。我需要的结果是它应该计算当天的第一个开始时间,当天的最后一个停止时间,每天开始服务器的总时间以及服务器。

表如下所示,也给出了预期的输出。

表:

Date & Time           Reader ServerID
3/14/2016 6:36:20 AM    ON  123
3/14/2016 6:58:45 AM    OFF 123
3/14/2016 8:06:19 AM    ON  123
3/14/2016 9:32:48 AM    OFF 123
3/15/16 6:00:00 AM      ON  123
3/15/16 6:01:00 AM      OFF 123
3/14/2016 9:46 AM       ON  124
3/14/2016 10:01 AM      OFF 124
3/14/16 11:01 AM        ON  124
3/14/16 12:01 PM        OFF 124

预期输出

UserID   FirstIN   Last Out  TotalInTime (min)    Date
123       6:00      09:32      86         3/14
123       06:00     06:01      1         3/15
124       9:46      12:01      75         3/14 

1 个答案:

答案 0 :(得分:0)

所以,对于每一天和每天服务器,您希望最小和最大时间以及分钟总和为“ON”。

首先,您需要可以计算其分钟数的ON / OFF对(行上的对,而不是行对)。然后你总结分钟并采取最小和最大时间。

SQL Server有datepart。您可以使用它来计算天数。要制作On / Off对,请按以下方式将表连接到自身:

select   A.ServerID, datepart(day, A.time) as day, 
         A.time as ON, min(B.time) as OFF
from     T as A join T as B on datepart(day, A.time) = datepart(day, B.time)
and      A.Reader = 'ON' and B.Reader = 'OFF'
and      A.time < B.time
group by A.ServerID, datepart(day, A.time), A.time

您可以创建这样的视图或CTE,或将结果插入临时表中。我们调用结果V

select   ServerID, day, min(ON), max(OFF)
       , sum(datediff(minute, OFF, ON)) as minutes
from     V
group by ServerID, day

(您也可以将第一个查询嵌套在第二个查询中。)

诀窍是知道如何找到任何一对的“下一个”时间(我answered often的问题),以及如何使用服务器的日期函数。