Как получить разницу во времени между несколькими записями по идентификатору пользователя?

0

Я хочу создать таблицу посещаемости, которую я получаю от машины для перфорации, например:

UID  |  Time
023  |  2019-01-29 20:06:53
023  |  2019-01-29 20:07:10
023  |  2019-01-29 20:22:05
123  |  2019-01-30 08:57:01
027  |  2019-01-30 09:14:14
023  |  2019-01-30 11:22:21
123  |  2019-01-30 18:35:53
027  |  2019-01-30 19:00:25

Теперь все записи в одной таблице, поэтому я хочу первую и последнюю запись пользователя и группы по дате, а затем получить разницу во времени из 2 значений

Мне нужен вывод, как это:

UID  |  In Time               |  Out Time              |  Time Diff.
023  |  2019-01-29 20:06:53   |  2019-01-29 20:22:05   |  00:18:00
027  |  2019-01-30 09:14:14   |  2019-01-30 19:00:25   |  10:00:00
123  |  2019-01-30 08:57:01   |  2019-01-30 18:35:53   |  10:00:00

Сначала я пытаюсь получить такие данные, но это не работает для меня

$select =  mysqli_query ($db, "SELECT *, Min(Date) AS MinDate, Max(Date) AS MaxDate FROM demotable GROUP BY UID");
  • 0
    Я предполагаю, что UID имеет первичный или уникальный ключ, иначе ваш SQL-запрос некорректен для MySQL для обработки
  • 0
    Да UID id - это уникальный идентификатор пользователя
Теги:
phpmyadmin

2 ответа

2

Вы можете использовать TIMEDIFF():

SELECT 
  UID, 
  Min(timecolumn) AS 'In Time', 
  Max(timecolumn)  AS 'Out Time',
  TIMEDIFF(Max(timecolumn), Min(timecolumn)) AS 'Time Diff'
FROM demotable 
GROUP BY UID, DATE(timecolumn)
  • 0
    да, но мне нужна такая же разница во времени дня, когда вы получаете данные от начала до конца из полной таблицы. ** Мне нужна первая и последняя запись дня **
  • 0
    Смотрите мой отредактированный ответ.
Показать ещё 3 комментария
0

Для той же разницы во времени дня вы можете использовать группу по выражению. Что касается вашего output- того же дня без времени, то не показывайте, что row- для этого вы можете использовать предложение HAVING, проверив, что max (время) не равно min (время) для того же дня.

SELECT 
  UID, 
  Min(Time) AS 'In Time', 
  Max(Time)  AS 'Out Time',
  TIMEDIFF(Max(Time), Min(Time)) AS 'Time Diff'
FROM demo                          
GROUP BY UID, DATE(Time)  
HAVING Max(Time) != Min(Time) 

вы также можете увидеть работающую демку Демо на dbfiddle

  • 0
    Логика !! Но могу ли я добавить ГДЕ время между «2019-01-30» и «2019-02-30» с этим, чтобы добавить фильтр по датам?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню