У меня есть таблица ниже, и, как вы можете видеть в таблице, у пользователя есть запись 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
Например:
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 |
+---------------------+----------+
Ну, так как вы действительно не говорите, как вы получаете эти данные и где вы хотите отобразить результат, вот как вы можете получить то, что хотите:
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'
....
);
Но так как у меня больше нет подробностей, не знаю, хорошо ли это в вашем случае!
Ну, если вы хотите сделать это в 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;
Обновления или обновления приветствуются. Надеюсь это поможет.