Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写SQL查询来计算聚合服务器的启动时间?_Sql_Sql Server - Fatal编程技术网

如何编写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

我在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 

因此,对于每一天&服务器,您需要最小和最大时间以及“开启”分钟数的总和

首先,您需要一行行的开/关对(一行上的对,而不是成对的行),您可以计算它们的分钟数。然后将分钟相加,取最小和最大时间

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