поле.

я есть таблица MySQL, в которой регистрируются время входа и выхода сотрудника. Здесь в столбце входа-выхода 1-представляет логин и 0-представляет выход.

  [id]   [User_id]           [Date_time]                 [in_out]
    1       1          2011-01-20 09:30:03                  1
    2       1          2011-01-20 11:30:43                  0
    3       1          2011-01-20 11:45:12                  1
    4       1          2011-01-20 12:59:56                  0
    5       1          2011-01-20 13:33:11                  1
    6       1          2011-01-20 15:38:16                  0
    7       1          2011-01-20 15:46:23                  1
    8       1          2011-01-20 17:42:45                  0

Можно ли получить общее количество часов, отработанных пользователем за день, с помощью одного запроса?

Я много пробовал, но все тщетно. Я могу сделать это в PHP с помощью массива, но не могу сделать это с помощью одного запроса.

 atp20 янв. 2011 г., 11:20
@ Алан: да, это так.
 atp20 янв. 2011 г., 19:59
@ Алан, ох, я не могу отличить юмор от осечки мозга;)
 Alan Pearce20 янв. 2011 г., 10:29
Технически это вообще невозможно, но если вы ищете время между тем, когда они включились, и когда они выключились, это возможно!
 Alan Pearce20 янв. 2011 г., 16:46
@Jasie: я шутил о том, что время, потраченное на работу, не равно разнице между временем включения и выключения.

Ответы на вопрос(3)

Решение Вопроса
SELECT `User_id`, time(sum(`Date_time`*(1-2*`in_out`)))
  FROM `whatever_table` GROUP BY `User_id`;

а каждому событию выхода - фактор +1.sum функция принимает суммуDate_time столбец, а GROUP BY `User_id` создает сумму для каждого отдельного пользователя.

 Hernán Eche01 мар. 2016 г., 19:29
Не работаетsqlfiddle.com/#!9/45870/1/0
 Rudi21 янв. 2011 г., 11:13
когдаin_out равно 1, этот термин (1-2 * 1) = - 1, что делаетDate_time поле для этой строки отрицательное. когдаin_out равно 0, член равен (1-2 * 0) = 1, иDate_time строка не изменена. Так чтоsum Функция видит положительное значение для каждого выхода из системы и отрицательное значение для каждого входа в систему. Итак, результатsum каждое событие выхода из системы вычитается из каждого события входа в систему. Функция времени вокруг суммы используется для того, чтобы сделать вывод более понятным, поскольку результатом суммы является значение даты и времени, где-то около года 1 января 1 года 0.
 Dario Russo19 апр. 2012 г., 20:56
это действительно креативное решение. Я люблю это.

Дайте это попробовать:

select [User_id], sum([Time_count])/3600
from (
  select [User_id],
         case when [in_out]=1 then   UNIX_TIMESTAMP([Date_time])
              when [in_out]=0 then - UNIX_TIMESTAMP([Date_time])
              end as [Time_count]
  from my_table
) as a
group by [User_id]

Я не знаю синтаксис MySQL, поэтому, если кто-то найдет ошибки, исправьте их. Возможно, не мог работать. Например, если у вас есть пользователь, вошедший в систему. В этом случае вы можете фильтровать только тех пользователей, которые имеют одинаковое количество единиц и 0 в[in_out] поле.

ятичными числами, используйте UNIX_TIMESTAMP () в поле date_time, в противном случае возвращаемым типом будет DATETIME (трудно анализировать). Вот результат для ваших первых 4 строк данных плюс еще 2 для другого дня:

SELECT 
    `user_id`, 
    DATE(`date_time`) AS `date`, 
    SUM(UNIX_TIMESTAMP(`date_time`)*(1-2*`in_out`))/3600 AS `hours_worked`
FROM `test` 
GROUP BY date(`date_time`), `user_id`;
+---------+------------+--------------+
| user_id | date       | hours_worked |
+---------+------------+--------------+
|       1 | 2011-01-20 |       3.2567 |
|       1 | 2011-01-21 |       3.0000 |
+---------+------------+--------------+
 Clutch27 сент. 2013 г., 18:21
Вы можете заменить датуdate_time) "в GROUP BY только с" date ", так как она уже была определена в выражении SELECT.

Ваш ответ на вопрос