Расчет времени по расписанию в операторе while PHP / MYSQL

1

У меня есть время с этим. Я смотрю, и я вижу разные вещи, которые я мог бы использовать, такие как CAST, функция date(), SUM, Javascript Math и т.д. Проблема в том, что я не знаю, какой из них использовать или какой из них я буду использовать в моем случае. Чем больше я читаю разные темы и "решения", тем больше меня путают, как применить это к моим потребностям.

У меня есть простая таблица расписания в моей базе данных под названием "расписание" в ней. У меня есть столбцы entry_id (AI), user_id, firstname, lastname, punch (datetime) и комментарий (in/out). Я сделал простой запрос в PHP, чтобы привести расписание пользователей в таблицу HTML, как показано ниже. Изображение 356974

В моем 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, а затем добавить это вместе, чтобы получить общее количество времени, затраченного на этот период времени. В конечном итоге это то, что мне нужно выполнить (см. Итого в красном внизу таблицы) Изображение 356981

Здесь приведен снимок таблицы базы данных "расписание" Изображение 356991

Теги:

1 ответ

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

Перед 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";
  • 0
    Вау, +1 за креативность, спасибо! У меня есть быстрый вопрос, хотя - используя приведенное выше изображение в качестве справки, когда я отображаю $ total (все еще в секундах), я получаю 202851 секунду, когда это значение превращается в часы, то получается 56,3475 часа. Так что где-то преобразование неверно. В изображении, если я делаю математику от руки, это примерно дает в общей сложности 15 минут, которые будут преобразованы в 0,25 часа. Где будет эта проблема?
  • 0
    Вы абсолютно правы! Расчет был неверным. Я думаю, что это поможет. Это 56:16:51 в вашем случае.
Показать ещё 8 комментариев

Ещё вопросы

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