MariaDb / MySQL скользящая сумма за 24 часа - PullRequest
0 голосов
/ 29 октября 2018

В моей таблице есть поля, которые представляют начальный и конечный рабочий период как datetime.

Мне нужно найти связанные записи, которые в общей сложности соответствуют 14 часам в течение 24 часов.

Я думаю, что оконная функция спасет меня (возможно), но MariadDB (я использую) пока не реализует интервалы времени в оконной функции.

Вот некоторые примеры данных:

id  starting_hour        ending_hour          
--  -------------------  -------------------
 1  2018-09-02 06:00:00  2018-09-02 08:30:00  
 2  2018-09-03 08:30:00  2018-09-03 10:00:00  
 4  2018-09-03 11:00:00  2018-09-03 15:00:00  
 5  2018-09-02 15:30:00  2018-09-02 16:00:00  
 6  2018-09-02 16:15:00  2018-09-02 17:00:00  
 7  2018-09-20 00:00:00  2018-09-20 08:00:00  
 8  2018-09-19 10:00:00  2018-09-19 12:00:00  
 9  2018-09-19 12:00:00  2018-09-19 16:00:00  
10  2018-10-08 12:00:00  2018-10-08 14:00:00  
11  2018-10-29 09:00:00  2018-10-29 10:00:00  

Итак, как найти строки, в которых за 24 часа их сумма больше или равна 14 часам.

спасибо

Edit:

SELECT
  id,
  starting_hour,
  ending_hour,
  TIMEDIFF (ending_hour, starting_hour) AS duree,
  (
SELECT SUM(TIMEDIFF(LEAST(ending_hour, DATE_ADD(a.starting_hour, INTERVAL 24 HOUR)), starting_hour)) / 10000
FROM `table` b
WHERE b.starting_hour BETWEEN a.starting_hour AND DATE_ADD(a.starting_hour, INTERVAL 24 HOUR)
  ) AS duration              
FROM
  `table` a
HAVING duration >= 14
ORDER BY starting_hour ASC
 ;

Это возвращает Id 8, но я хочу весь период. (например: Id 8, Id 9 и Id 7)

EDIT2:

Ожидаемые результаты - это диапазоны рабочего времени, когда они находятся в 24-часовом окне, а их сумма больше или равна 14 часам.

РЕДАКТИРОВАТЬ 3: На самом деле под MySQL 8 это работает.

SELECT * FROM (
SELECT
  *,
  SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(hs.`ending_hour`, hs.`starting_hour`))) OVER (ORDER BY hs.starting_hour RANGE BETWEEN INTERVAL '12' HOUR PRECEDING AND INTERVAL '12' HOUR following)) AS tot
FROM
  table hs
  WHERE hs.`starting_hour` > DATE_SUB(NOW(), INTERVAL 50 DAY) AND hs.`ending_hour` <= NOW()
 ORDER BY hs.`starting_hour` ASC
 ) t1
  HAVING tot >= '14:00:00' 
 ;

Есть ли способ сделать это под MariaDB 10.2 без оконной функции? Или без функции диапазона окон?

...