我有一个名为serverstatus的db表,它存储时间和状态,如下所示。在任何给定时间我应该如何找到总的停机时间?
Time Status
10:00 UP
11:30 DOWN
12:00 UP
14:00 DOWN
15:00 UP
例如,在16:00,总停机时间为1小时30分钟。我尝试在两个连续的行之间进行自连接和减法,但无法得到正确的答案
Select A.time-min(B.time) from serverstatus A, serverstatus B where A.status="UP" and B.status="DOWN" and B.time < A.time
答案 0 :(得分:1)
如果您的mysql版本中没有row_number函数,则可以使用行号模拟执行此操作
select #s.*,t.*,timediff(endtime,starttime) duration
sec_to_time(sum(time_to_sec(timediff(endtime,starttime))) / 60) Downduration
from
(
select t.time starttime,t.status,@rn:=@rn+1 rn,
@p:=status p
from t,(select @rn:=0,@p:='') r
order by time
) s
join
(
select t.time endtime,t.status,@rn1:=@rn1+1 rn1,
@p1:=status p1
from t,(select @rn1:=0,@p1:='') r1
order by time
) t on t.rn1 = s.rn + 1
where s.status = 'Down' and t.status = 'Up'
+---------------+
| Downduration |
+---------------+
| 00:01:30.0000 |
+---------------+
1 row in set (0.00 sec)