Мне нужно выяснить, сколько времени машина работает и находится в режиме ожидания. У меня есть записи в базе данных, например, так:
| machine | running | start |
|---------|---------|---------------------|
| 1 | 0 | 2018-03-13 00:00:00 |
| 1 | 1 | 2018-03-13 00:30:00 |
| 1 | 0 | 2018-03-13 02:00:00 |
Настало время 2018-03-13 04:00:00
, При использовании примера выше, результаты должны быть 01:30:00
(работает) и 02:30:00
(ожидание).
Каков наилучший способ сделать такой расчет? Достаточно ли хороши записи в моей базе данных?
Я использую такие инструменты, как Laravel в бэкэнде и f.ex. Vue и Moment.js во внешнем интерфейсе. Заранее спасибо.
Надеюсь, что это делает трюк:
<?php
$rs = [
[
'machine' => 1,
'running' => 0,
'start' => '2018-03-13 00:00:00'
],
[
'machine' => 1,
'running' => 1,
'start' => '2018-03-13 00:30:00'
],
[
'machine' => 1,
'running' => 0,
'start' => '2018-03-13 02:00:00'
],
[
'machine' => 1,
'running' => 1,
'start' => '2018-03-13 03:00:00'
],
];
$lastState = -1;
$startDateTime = $endDateTime = null;
$totalStates = count($rs);
foreach ($rs as $r)
{
$machine = $r['machine'];
$running = $r['running'];
$start = $r['start'];
if (-1 === $lastState) {
$startDateTime = new \DateTime($start);
$lastState = $running;
}
else {
$endDateTime = new \DateTime($start);
$dateTimeInterval = $endDateTime->diff($startDateTime);
echo "State: ". $lastState ." / Total time: " . $dateTimeInterval->format("%H:%I:%S") . "\n";
$startDateTime = new \DateTime($start);
$lastState = $running;
}
}
Выход:
State: 0 / Total time: 00:30:00
State: 1 / Total time: 01:30:00
State: 0 / Total time: 01:00:00
Других решений пока нет …