Чтобы получить необходимые данные, вы можете использовать следующий запрос:
ПРИМЕЧАНИЕ: В зависимости от CURRDATE()
примеры не пройдут.Вы можете ofc.замените CURDATE()
фиксированным значением, таким как 2018-11-27
;
Объяснение:
- Запрос соединяет таблицу с самим собой, учитывая, что вкл / выкл следует друг за другом(
L.id = R.id -1
) - Запрос выбирает любой результат, где «включено» или «выключено» равно
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
Пример использования NOW()
для подсчета секунд, если последним состоянием является on
: http://sqlfiddle.com/#!9/3c6227/1
Если вам просто нужны агрегаты из этого, вы можете использовать другой Surrounding Select и рассчитать процент, знаядень имеет 86400 секунд:
SELECT
SUM(RunningSeconds) AS RunningSeconds,
SUM(RunningSeconds) / 86400 * 100 AS PercentageRunning
FROM (
...
) as temp;
http://sqlfiddle.com/#!9/20bc14/5