Выберите запрос, который выводит количество строк в течение определенного периода времени - PullRequest
0 голосов
/ 04 июня 2018

Мой вопрос немного сложнее, чем подразумевается в заголовке, но вот он:

У меня есть таблица с данными перфорации, отформатированные так:

name time_in              time_out             location
1    2018-05-31 10:09:00  2018-05-31 16:06:00  1
3    2018-05-31 10:12:00  2018-05-31 17:03:00  1

Я бы хотелзапрос select, который возвращает общее время в часах людей, работающих в течение 15 минут, для каждого местоположения.Вот пример выходных данных для двух указанных строк:

time                 labor_hours  location
2018-05-31 10:00:00  .15          1
2018-05-31 10:15:00  .50          1
2018-05-31 10:30:00  .50          1
2018-05-31 10:45:00  .50          1
2018-05-31 11:00:00  .50          1
...
2018-05-31 15:45:00  .50          1
2018-05-31 16:00:00  .35          1
2018-05-31 16:15:00  .25          1
2018-05-31 16:30:00  .25          1
2018-05-31 16:45:00  .25          1
2018-05-31 17:00:00  .10          1

Рабочее время - это общее количество отработанных часов за 15 минут в часах.Так, например, первая строка была рассчитана путем просмотра первых двух строк и определения того, что с 10:00:00 до 10:15:00 сотрудники 1 и 2 работали в общей сложности 9 минут.Так как это в часах 9/60 = .15.

Я новичок в SQL, так что я довольно растерялся, как начать с этого.

1 Ответ

0 голосов
/ 04 июня 2018

Если вы используете MySQL 8.0, вы можете использовать функцию CTE следующим образом

WITH cte (timeStamp) AS
(
  SELECT "2018-05-31 00:00:00"
  UNION ALL
  SELECT TIMESTAMPADD(MINUTE, 15, timeStamp) 
  WHERE timeStamp < 2018-06-01 00:00:00
)
SELECT timeStamp FROM cte;

SELECT cte.time, 
sum(TIMESTAMPDIFF(MINUTE, punch.time, 
                  TIMESTAMPAD(MINUTE, 15, cte.timeStamp))) as labour_hours, 
punch.location 
FROM cte LEFT OUTER JOIN punch ON punch.time >=cte.timeStamp 
AND punch.time < TIMESTAMPADD(MINUTE, 15, cte.timeStamp)
GROUP BY punch.location, cte.timeStamp

Если вы используете более старую версию MySQL, вам нужно создать stored procedureкоторый генерирует временные метки с 15-минутными интервалами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...