在MySQL中列具有0的持续时间之间选择时间戳值

在MySQL中列具有0的持续时间之间选择时间戳值,mysql,sql,Mysql,Sql,我想选择正常运行时间为0或继续为0时的时间限制统计日期 表: 插入语句: insert into sample values(null,'hi',10,'2015-01-08 05:30:00'); insert into sample values(null,'hi',20,'2015-01-08 05:40:00'); insert into sample values(null,'hi',30,'2015-01-08 05:50:00'); insert into sample value

我想选择正常运行时间为0或继续为0时的时间限制统计日期

表: 插入语句:

insert into sample values(null,'hi',10,'2015-01-08 05:30:00');
insert into sample values(null,'hi',20,'2015-01-08 05:40:00');
insert into sample values(null,'hi',30,'2015-01-08 05:50:00');
insert into sample values(null,'hi',40,'2015-01-08 06:00:00');
insert into sample values(null,'hi',50,'2015-01-08 06:10:00');
insert into sample values(null,'hi',0,'2015-01-08 06:20:00');
insert into sample values(null,'hi',10,'2015-01-08 06:30:00');
insert into sample values(null,'hi',20,'2015-01-08 06:40:00');
insert into sample values(null,'hi',30,'2015-01-08 06:50:00');
insert into sample values(null,'hi',40,'2015-01-08 07:00:00');
insert into sample values(null,'hi',0,'2015-01-08 07:10:00');
insert into sample values(null,'hi',0,'2015-01-08 07:20:00');
insert into sample values(null,'hi',0,'2015-01-08 07:30:00');
insert into sample values(null,'hi',0,'2015-01-08 07:40:00');
insert into sample values(null,'hi',0,'2015-01-08 07:50:00');
insert into sample values(null,'hi',10,'2015-01-08 08:00:00');
insert into sample values(null,'hi',20,'2015-01-08 08:10:00');
insert into sample values(null,'hi',0,'2015-01-08 08:20:00');
insert into sample values(null,'hi',40,'2015-01-08 08:30:00');
样本表:

mysql> select * from sample;
+----+-------+-------+---------------------+
| id | sname | uptime| stamp_date          |
+----+-------+-------+---------------------+
|  1 | hi    |    10 | 2015-01-08 05:30:00 |
|  2 | hi    |    20 | 2015-01-08 05:40:00 |
|  3 | hi    |    30 | 2015-01-08 05:50:00 |
|  4 | hi    |    40 | 2015-01-08 06:00:00 |
|  5 | hi    |    50 | 2015-01-08 06:10:00 |
|  6 | hi    |     0 | 2015-01-08 06:20:00 |
|  7 | hi    |    10 | 2015-01-08 06:30:00 |
|  8 | hi    |    20 | 2015-01-08 06:40:00 |
|  9 | hi    |    30 | 2015-01-08 06:50:00 |
| 10 | hi    |    40 | 2015-01-08 07:00:00 |
| 11 | hi    |     0 | 2015-01-08 07:10:00 |
| 12 | hi    |     0 | 2015-01-08 07:20:00 |
| 13 | hi    |     0 | 2015-01-08 07:30:00 |
| 14 | hi    |     0 | 2015-01-08 07:40:00 |
| 15 | hi    |     0 | 2015-01-08 07:50:00 |
| 16 | hi    |    10 | 2015-01-08 08:00:00 |
| 17 | hi    |    20 | 2015-01-08 08:10:00 |
| 18 | hi    |     0 | 2015-01-08 08:20:00 |
| 19 | hi    |    40 | 2015-01-08 08:30:00 |
+----+-------+-------+---------------------+
19 rows in set (0.00 sec)
1链接在06:20:00到06:30:00之间的正常运行时间为0

2链接在07:10:00到08:00:00之间的正常运行时间为0

3链路在08:20:00到08:30:00之间的正常运行时间为0

预期结果应如下所示:

+++++++++++++++++++++++++
| When Uptime is 0      |
+++++++++++++++++++++++++
|  06:20:00 to 06:30:00 |
|  07:10:00 to 08:00:00 |
|  08:20:00 to 08:30:00 |
+++++++++++++++++++++++++ 
有人能帮我写一个SQL或存储过程来实现上述结果吗

谢谢


Yogesh

如果你的ID没有漏洞,例如18后面没有20,那么下面的查询就可以了:

select concat(time(r.stamp_date), ' to ', 
       IFNULL((select time(min(stamp_date))
       from sample
       where id > r.id and uptime != 0
       ), "NOW")) `When Uptime is 0`
from sample l 
     join
     sample r 
     on l.id = r.id - 1
where l.uptime != 0 and r.uptime = 0;
这是它为您的数据返回的内容,最后有一个额外的停机条目

+-----------+ |正常运行时间为0时| +-----------+ |06:20:00至06:30:00| |07:10:00至08:00:00| |08:20:00至08:30:00| |08:40:00至今| +-----------+ 设置4行0.00秒

如果您的ID确实有漏洞,那么您需要稍微修改ON条件

select concat(time(r.stamp_date), ' to ', 
       IFNULL((select time(min(stamp_date))
       from sample
       where id > r.id and uptime != 0
       ), "NOW")) `When Uptime is 0`
from sample l 
     join
     sample r 
     on l.id = (select max(id) from sample where id < r.id)
where l.uptime != 0 and r.uptime = 0;
在小提琴上看看这个


谢谢你的回复。第二个SQL查询可以很好地返回结果。其中,第一个SQL查询只返回两条记录。请您帮助我使用另一个SQL,它返回所有非零间隔,如05:30:00到06:20:00、06:30:00到07:10:00以及08:00:00到08:20:00、08:30:00到现在?再次感谢。fiddle中的上述查询返回的第二个结果07:50:00到08:00:00不正确。第一个06:20:00到06:30:00和第三个结果08:20:00到08:30:00都可以。第二个结果必须是07:10:00到08:00:00。谢谢
select concat(time(r.stamp_date), ' to ', 
       IFNULL((select time(min(stamp_date))
       from sample
       where id > r.id and uptime != 0
       ), "NOW")) `When Uptime is 0`
from sample l 
     join
     sample r 
     on l.id = (select max(id) from sample where id < r.id)
where l.uptime != 0 and r.uptime = 0;
SELECT 
  CONCAT(
    DATE_FORMAT(a.stamp_date, '%H:%i:%s'),
    ' to ',
    DATE_FORMAT(b.stamp_date, '%H:%i:%s')
  ) AS 'When Uptime is 0' 
FROM
  (SELECT 
    id,
    stamp_date 
  FROM
    sample 
  WHERE uptime = 0) AS a,
  (SELECT 
    id,
    stamp_date 
  FROM
    sample 
  WHERE uptime <> 0) AS b 
WHERE a.stamp_date < b.stamp_date 
AND a.id = b.id-1
GROUP BY a.id