在MySQL中列具有0的持续时间之间选择时间戳值
我想选择正常运行时间为0或继续为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
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