Рассчитать время между отметками времени для каждых 2 строк

0

У меня есть таблица ниже, и, как вы можете видеть в таблице, у пользователя есть запись BREAK OUT и BREAK IN для каждого из перерывов, но я изо всех сил пытаюсь вычислить время, затрачиваемое на каждый перерыв. Можете ли вы помочь? Благодарю.

ID  Name      Action     Datetime
 2  John Doe  BREAK OUT  2018-05-24 09:00:41
 3  John Doe  BREAK IN   2018-05-24 09:10:45
 4  John Doe  BREAK OUT  2018-05-24 13:00:49
 5  John Doe  BREAK IN   2018-05-24 13:30:52
 6  John Doe  BREAK OUT  2018-05-24 15:30:56
 7  John Doe  BREAK IN   2018-05-24 15:40:59
  • 2
    ты что-нибудь пробовал? Где ты хочешь рассчитать это? в запросе MySQL, в PHP, в JS? Откуда поступают данные? Как генерируется HTML? ...? так много вопросов.
  • 1
    Как насчет поиска / консультации по руководству ?
Показать ещё 6 комментариев
Теги:
datediff

3 ответа

0
Лучший ответ

Например:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(Action VARCHAR(20) NOT NULL,dt DATETIME PRIMARY KEY);

INSERT INTO my_table VALUES
('BREAK OUT','2018-05-24 09:00:41'),
('BREAK IN','2018-05-24 09:10:45'),
('BREAK OUT','2018-05-24 13:00:49'),
('BREAK IN','2018-05-24 13:30:52'),
('BREAK OUT','2018-05-24 15:30:56'),
('BREAK IN','2018-05-24 15:40:59');

SELECT bi.dt
     , SEC_TO_TIME(TIME_TO_SEC(bi.dt)-TIME_TO_SEC(MAX(bo.dt)))x 
  FROM my_table bi 
  JOIN my_table bo 
    ON bo.dt <= bi.dt 
 WHERE bo.action = 'break out' 
   AND bi.action = 'break in' 
 GROUP 
    BY bi.dt;

+---------------------+----------+
| dt                  | x        |
+---------------------+----------+
| 2018-05-24 09:10:45 | 00:10:04 |
| 2018-05-24 13:30:52 | 00:30:03 |
| 2018-05-24 15:40:59 | 00:10:03 |
+---------------------+----------+
  • 0
    Это здорово, но как добавить еще одно условие для проверки на основе user_id? У меня есть несколько пользователей в таблице с одним и тем же действием, но текущий запрос показывает только один ...
  • 0
    @KriogenMihalcea Ваш пример показал только одного пользователя, поэтому я проигнорировал этот бит. Но вы можете просто изменить предложение select, предложение join и предложение group by соответственно.
1

Ну, так как вы действительно не говорите, как вы получаете эти данные и где вы хотите отобразить результат, вот как вы можете получить то, что хотите:

function getDateDiff($breakOut, $breakIn) {
    $dateStart = new DateTime($breakOut);
    $dateEnd   = new DateTime($breakIn); 

    $dateDiff  = $dateStart->diff($dateEnd); 

    return $dateDiff->format("%H:%I:%S");
}

Теперь вам просто нужно использовать функцию и вернуть diff:

2   John Doe    BREAK OUT   2018-05-24 09:00:41
3   John Doe    BREAK IN    2018-05-24 09:10:45

var_dump(getDateDiff("2018-05-24 09:00:41", "2018-05-24 09:10:45")); // '00:10:04'

4   John Doe    BREAK OUT   2018-05-24 13:00:49
5   John Doe    BREAK IN    2018-05-24 13:30:52

var_dump(getDateDiff("2018-05-24 13:00:49", "2018-05-24 13:30:52")); // '00:30:03'

6   John Doe    BREAK OUT   2018-05-24 15:30:56
7   John Doe    BREAK IN    2018-05-24 15:40:59

var_dump(getDateDiff("2018-05-24 15:30:56", "2018-05-24 15:40:59")); // '00:10:03'

Поэтому, если вы хотите получить результат в цикле PHP, возможно, вы можете попробовать следующее:

// your data array, I assume it looks like this since I have no info
$array(
    2 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 09:00:41",
    ),
    3 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 09:10:45",
    ),
    4 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 13:00:49",
    ),
    5 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 13:30:52",
    ),
    ...
); 

$array_break_time = array();
foreach ($array as $key => $data) {
    if ($key % 2 == 0) {
        if(isset($array[$key + 1])) {
            $array_break_time[] = getDateDiff($data["break"], $array[$key + 1]["break"])
        }
    }
}

Выход:

$array_break_time = array(
    0 => '00:10:04',
    1 => '00:30:03'
    ....
);

Но так как у меня больше нет подробностей, не знаю, хорошо ли это в вашем случае!

-1

Ну, если вы хотите сделать это в MySQL, вы можете использовать такие подзапросы, как это. 1. Дайте индивидуальный идентификатор своим сотрудникам и сохраните их имена в другой таблице, где их идентификатор сотрудника - первичный ключ, а в этой таблице хранятся их личные данные. 2. В этой таблице есть только идентификатор сотрудника, прорыв и разрыв во времени вместе с датой. то вы можете использовать этот запрос и выбрать конкретного сотрудника, чтобы узнать время перерыва.

select timediff((select breakout_time from table where employee_id = ? and date=?),(select breakin_time from table where employee_id = "same as above" and date="Same as above")) from dual;

Обновления или обновления приветствуются. Надеюсь это поможет.

Ещё вопросы

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