要获取所需数据,可以使用以下查询:
注意:根据CURRDATE(),示例将失败。你可以。将CURDATE() 替换为固定值,例如2018-11-27;
解释:
- 查询正在将表与自身连接起来,同时考虑到开/关相互跟随 (
L.id = R.id -1)
- 查询选择任何结果,其中“on”或“off”为
today。
- 如果
on 是昨天,则准时“更正”为今天的00:00:00:case when L.Time < CURDATE() then CURDATE() else L.Time end as onTime
- 如果最后一个条目是
on,则关闭时间将“更正”为明天的00:00:00:COALESCE(R.time, CURDATE() + Interval 1 day)(注意:您可能希望使用NOW() 而不是CURDATE() + Interval 1 day,以获得当前距离“现在”的秒数)
- 相同的两种方法用于计算运行秒数。
查询:
SELECT
L.playtime_id AS LID,
R.playtime_id AS RID,
case when L.Time < CURDATE() then CURDATE() else L.Time end as onTime,
COALESCE(R.time, CURDATE() + Interval 1 day) AS offTime,
(
UNIX_TIMESTAMP(COALESCE(R.time, CURDATE() + Interval 1 day)) -
UNIX_TIMESTAMP(case when L.Time < CURDATE() then CURDATE() else L.Time end)
) as RunningSeconds
FROM item0005 as L
LEFT JOIN item0005 AS R
ON L.playtime_id = R.playtime_id -1
WHERE
L.`value` = 1 AND
(
DATE(L.Time) = CURDATE() OR
DATE (R.Time) = CURDATE()
)
;
结果示例:
LID RID onTime offTime RunningSeconds
2 3 2018-11-27T09:00:00Z 2018-11-27T11:26:24Z 8784
4 5 2018-11-27T11:26:27Z 2018-11-27T11:28:29Z 122
6 7 2018-11-27T11:29:39Z 2018-11-27T11:39:55Z 616
8 (null) 2018-11-27T11:50:55Z 2018-11-28T00:00:00Z 43745
假设明天 00:00:00 的示例:http://sqlfiddle.com/#!9/20bc14/1
如果最后一个状态是on,则使用NOW() 计算秒数的示例:http://sqlfiddle.com/#!9/3c6227/1
如果您只需要其中的聚合,您可以使用另一个环绕选择并通过知道一天有 86400 秒来计算百分比:
SELECT
SUM(RunningSeconds) AS RunningSeconds,
SUM(RunningSeconds) / 86400 * 100 AS PercentageRunning
FROM (
...
) as temp;
http://sqlfiddle.com/#!9/20bc14/5