如何编写SQL查询来计算聚合服务器的启动时间?
我在SQL中有一个要求,我每天都有一个月的服务器开始停止时间的数据。我需要的结果,它应该计算一天中的第一个开始时间,一天中的最后一个停止时间,服务器在一天中每天启动的总时间和服务器 下表如下,并给出了预期输出 表:如何编写SQL查询来计算聚合服务器的启动时间?,sql,sql-server,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
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
因此,对于每一天&服务器,您需要最小和最大时间以及“开启”分钟数的总和 首先,您需要一行行的开/关对(一行上的对,而不是成对的行),您可以计算它们的分钟数。然后将分钟相加,取最小和最大时间 SQL Server具有
datepart
。你可以用它来计算天数。要创建开/关对,请沿以下线将表连接到自身:
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
(也可以将第一个查询嵌套在第二个查询中。)
诀窍在于知道如何为任何一对找到“下一个”时间(我有一个问题),以及如何使用服务器的日期函数 两种不同的日期格式,在同一列中!?!列数据类型?能否将表数据链接到预期输出?我在你的表格样本中看到了3/14的日期,但是你的预期输出大约是8/24。我已经编辑了表格和预期输出。请查收@Arthur DHi@jarlh,我已经编辑过了。请立即检查并提供帮助。我找不到列数据类型。(您既有YY年又有YYYY年,这让我猜它是字符数据类型?)
select ServerID, day, min(ON), max(OFF)
, sum(datediff(minute, OFF, ON)) as minutes
from V
group by ServerID, day