У меня есть время с этим. Я смотрю, и я вижу разные вещи, которые я мог бы использовать, такие как CAST, функция date(), SUM, Javascript Math и т.д. Проблема в том, что я не знаю, какой из них использовать или какой из них я буду использовать в моем случае. Чем больше я читаю разные темы и "решения", тем больше меня путают, как применить это к моим потребностям.
У меня есть простая таблица расписания в моей базе данных под названием "расписание" в ней. У меня есть столбцы entry_id (AI), user_id, firstname, lastname, punch (datetime) и комментарий (in/out). Я сделал простой запрос в PHP, чтобы привести расписание пользователей в таблицу HTML, как показано ниже.
В моем PHP-запросе я запускаю инструкцию WHILE для записи записей. Поскольку я использую цикл, я понятия не имею, как я могу/рассчитывать время, чтобы дать общее общее количество часов, отработанных за этот период времени.
Вот мой запрос:
$timesheet = mysqli_query($connect, "SELECT DATE_FORMAT(punch, '%Y/%m/%d') AS punch_date, DATE_FORMAT(punch, '%H:%i:%s') AS punch_time, comment
FROM timesheet WHERE user_id = '$employee' AND punch BETWEEN '$fromDate' AND '$toDate'") or die('Error: ' . mysqli_error($connect));
if(mysqli_num_rows($timesheet)>0){
$output = '<table class="table table-striped">
<thead>
<tr>
<th>Date</th>
<th>Time</th>
<th>Status</th>
</tr>
</thead>
<tbody>';
while ($row = mysqli_fetch_array($timesheet, MYSQL_ASSOC)) {
$date = $row['punch_date'];
$time = $row['punch_time'];
$status = $row['comment'];
$output .= '<tr>
<td>' . $date . '</td>
<td ';
if($status === 'In'){
$output .= 'class="in-time"';
} elseif($status === 'Out') {
$output .= 'class="out-time"';
}
$output .= '>' . $time . '</td>
<td>' . $status . '</td>
</tr>';
} //end while
$output .= '</tbody>
</table>';
echo $output;
} //end if mysqli_num_rows
Можно ли даже рассчитать время в цикле? Если бы вы не могли дать пример и не могли бы вы указать мне направление того, где/что я делаю неправильно?
UPDATE: каждый раз, когда запись имеет статус In или Out как статус, поэтому мне нужно получить разницу в каждом наборе In и Out, а затем добавить это вместе, чтобы получить общее количество времени, затраченного на этот период времени. В конечном итоге это то, что мне нужно выполнить (см. Итого в красном внизу таблицы)
Здесь приведен снимок таблицы базы данных "расписание"
Перед while() мы должны решить, будем ли мы использовать все строки для вычисления общего времени или нет.
Потому что здесь есть улов. Что делать, если пользователь вошел в систему, но еще не выходил из системы?
В этом случае мы не будем использовать последнее зарегистрированное время в нашей общей сумме. Так:
$iterations = mysqli_num_rows($timesheet) % 2 == 0 ? mysqli_num_rows($timesheet) : mysqli_num_rows($timesheet) - 1;
Внутри цикла while конвертируйте punch_time в несколько секунд.
while() {
...
$parts = explode(':', $row['punch_time']);
$seconds = (int) $parts[0] * 3600 + (int) $parts[1] * 60 + (int) $parts[2];
if($status === 'In'){
$output .= 'class="in-time"';
$total -= $iterations ? $seconds : 0; // Subtract from total when in and there is out coming
} else if($status === 'Out') {
$output .= 'class="out-time"';
$total += $seconds; // Add to total when out
}
...
$iterations--;
}
После цикла вы можете преобразовать секунды в желаемый формат, используя
$hours = floor($total / 3600);
$minutes = floor(($total / 60) % 60);
$seconds = $total % 60;
echo "$hours:$minutes:$seconds";