Получите общее количество часов с PHP и MySQL - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть следующая таблица

id | user_id | date                 | status
1  |    53   | 2018-09-18 06:59:54  | 1
2  |    62   | 2018-09-18 07:00:16  | 1
3  |    53   | 2018-09-18 09:34:12  | 2
4  |    53   | 2018-09-18 12:16:27  | 1
5  |    53   | 2018-09-18 18:03:19  | 2
6  |    62   | 2018-09-18 18:17:41  | 2

Я хотел бы получить общее количество рабочих часов (из диапазона дат) и сгруппировать их по user_id

ОБНОВЛЕНИЕ

Система не «требует» проверки, поэтому, если есть только одно значение, можем ли мы установить время проверки по умолчанию, скажем, 19:00:00?Если нет, я могу проверять каждый день в 21:00:00, нет ли времени проверки, чтобы вручную вставить его в 19:00: 00

ОБНОВЛЕНИЕ 2

Я добавил новое полев таблице «статус», поэтому самая первая регистрация даты статуса = 1 и каждая вторая регистрация статуса = 2

Так что, если пользователь регистрируется в третий раз в течение днястатус снова будет равен 1 и т. д.

Надеюсь, это облегчит задачу

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

В случае многократной регистрации заезда и отъезда в течение дня для пользователя:

  • Использование Коррелированный подзапрос , мы можем найти соответствующее "время проверки для"каждые "checkin_time".
  • Также обратите внимание на использование Ifnull () , Timestamp () функций и т. д., чтобы считать "checkout_time" по умолчанию как 19: 00: 00 , в случае отсутствия соответствующей записи.
  • Затем, рассматривая этот расширенный набор данных как Производная таблица , мы группируем набор данных на основе user_id и date.Дата ( гггг-мм-дд ) может быть определена с помощью функции Date () .
  • В конце концов, используйте функцию Timestampdiff () с Сумма агрегация, чтобы определить общее количество рабочих секунд для user_id на определенную дату.
  • Вы можете легко преобразовать эти общие секунды в часы (либо в коде приложения, либо в запросе).сама (делим секунды на 3600).
  • Причина, по которой я предпочел вычислить с использованием секунд, так как функция Timestampdiff () возвращает только целое число, поэтому могут возникать ошибки усечения в случае несколькихcheckin / checkout (s).

Используйте следующий запрос (замените your_table на ваше фактическое имя таблицы):

SELECT inner_nest.user_id, 
       DATE(inner_nest.checkin_time) AS work_date, 
       SUM(TIMESTAMPDIFF(SECOND, 
                         inner_nest.checkin_time,
                         inner_nest.checkout_time)) AS total_work_seconds  
FROM 
(
  SELECT t1.user_id, 
         t1.date as checkin_time, 
         t1.status, 
         IFNULL( ( 
                  SELECT t2.date 
                  FROM your_table AS t2 
                  WHERE t2.user_id = t1.user_id 
                    AND t2.status = 2 
                    AND t2.date > t1.date 
                    AND DATE(t2.date) = DATE(t1.date) 
                  ORDER BY t2.date ASC LIMIT 1
                 ), 
                 TIMESTAMP(DATE(t1.date),'19:00:00')
               ) AS checkout_time 
  FROM `your_table` AS t1 
  WHERE t1.status = 1
) AS inner_nest 
GROUP BY inner_nest.user_id, DATE(inner_nest.checkin_time)

Дополнительно: Следующее решение будет работать для случая, когда есть единый заезд и соответствующий выезд в тот же день.

  • Сначала необходимо сгруппировать набор данных на основеuser_id и date. Дата ( гггг-мм-дд ) может быть определенадобывается с помощью функции Date () .

  • Теперь используйте функции агрегирования, такие как Min () и Max () длянайти время начала и закрытия для user_id на конкретную дату.

  • В конце концов, используйте функцию Timestampdiff () , чтобы определить рабочее время для user_id вконкретная дата (разница между временем закрытия и началом)

Попробуйте выполнить следующий запрос (замените your_table на фактическое имя таблицы):

SELECT user_id, 
       DATE(`date`) AS working_date, 
       TIMESTAMPDIFF(HOUR, MIN(`date`), MAX(`date`)) AS working_hours 
FROM your_table 
GROUP BY 
  user_id, 
  DATE(`date`)
0 голосов
/ 19 сентября 2018

Использование TIMESTAMPDIFF функция

запрос больше похож на:

SELECT t1.user_id, TIMESTAMPDIFF(HOUR,t1.date,t2.date) as difference
FROM your_table t1
       INNER JOIN your_table t2 on t1.user_id = t2.user_id
Group By t1.user_id

Вы можете видеть это как предпочтение TimeStampDiff

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