2014-10-17 6 views
0

Я запрашиваю, чтобы получить дату и время сотрудника из базы данных. Затем я вычисляю общее количество часов и минут, которые они работают в течение дня. В настоящее время я застрял в точке, где мне нужно рассчитать общие часы работы сотрудника за неделю. Пожалуйста, помогите, как рассчитать общее количество часов и минут, в течение которых сотрудник работал через неделю.Как рассчитать общее количество часов и минут в неделю сотрудника

Код

<?php 
    $sql = "SELECT * FROM records WHERE records_status = 'finished' AND record_created > DATE_SUB('2014-10-19', INTERVAL 7 DAY)"; 
    $query = $db->SELECT($sql); 
?> 
<table width="39%" border="1"> 
    <tbody> 
    <tr> 
     <td style="padding: 8px;"><strong>Day</strong></td> 
     <td style="padding: 8px;"><strong>Total Hours</strong></td> 
    </tr> 
    <?php 
      $tally = ""; 
      foreach($db->FETCH_OBJECT() as $row){ 
       $record_sign_in = $row->record_sign_in; 
       $record_sign_out = $row->record_sign_out; 
       $record_created = $row->record_created; 
       $time1 = date("H:i", strtotime($record_sign_in)); 
       $time2 = date("H:i", strtotime($record_sign_out)); 
       $record_created = date("l", strtotime($record_created)); 
       $day = $record_created; 
       list($hours, $minutes) = explode(':', $time1); 
        $startTimestamp = mktime($hours, $minutes); 
       list($hours, $minutes) = explode(':', $time2); 
        $endTimestamp = mktime($hours, $minutes); 
       $seconds = $endTimestamp - $startTimestamp; 
       $minutes = ($seconds/60) % 60; 
       $hours = floor($seconds/(60 * 60)); 

       $tally = "What to do here?"; 
     ?> 
    <tr> 
     <td style="padding: 8px;"><?php echo $day; ?></td> 
     <td style="padding: 8px;"><?php echo $hours; ?> hrs <?php echo $minutes; ?> min</td> 
    </tr> 
    <?php } ?> 
    <tr> 
     <td style="padding: 8px;">Total</td> 
     <td style="padding: 8px;"></td> 
    </tr> 
    </tbody> 
</table> 

Это как визуальный таблица выглядит.

enter image description here

ответ

1

Ну вы можете начать с удаления много ненужного промежуточного переменного создания, а затем все, что вам нужно сделать, это добавить $seconds к $tally каждый раз через петлю, а затем преобразовать $tally в минутах и ​​секундах, как вы уже где на каждый день.

<?php 
    $sql = "SELECT * 
      FROM records 
      WHERE records_status = 'finished' 
       AND record_created > DATE_SUB('2014-10-19', INTERVAL 7 DAY)"; 
    $query = $db->SELECT($sql); 
?> 
<table width="39%" border="1"> 
    <tbody> 
    <tr> 
     <td style="padding: 8px;"><strong>Day</strong></td> 
     <td style="padding: 8px;"><strong>Total Hours</strong></td> 
    </tr> 
    <?php 
      $tally = 0; 
      foreach($db->FETCH_OBJECT() as $row){ 

       $time1 = date("H:i", strtotime($row->record_sign_in)); 
       $time2 = date("H:i", strtotime($row->record_sign_out;)); 
       $day = date("l", strtotime($row->record_created)); 

       list($hours, $minutes) = explode(':', $time1); 
        $startTimestamp = mktime($hours, $minutes); 
       list($hours, $minutes) = explode(':', $time2); 
        $endTimestamp = mktime($hours, $minutes); 

       $seconds = $endTimestamp - $startTimestamp; 
       $minutes = ($seconds/60) % 60; 
       $hours = floor($seconds/(60 * 60)); 

       $tally += $seconds; 
     ?> 
    <tr> 
     <td style="padding: 8px;"><?php echo $day; ?></td> 
     <td style="padding: 8px;"><?php echo $hours; ?> hrs <?php echo $minutes; ?> min</td> 
    </tr> 
    <?php } ?> 
    <tr> 
     <td style="padding: 8px;">Total</td> 
<?php 
    $minutes = ($tally/60) % 60; 
    $hours = floor($tally/(60 * 60)); 
?> 
     <td style="padding: 8px;"> 
     <?php echo $hours; ?> hrs <?php echo $minutes; ?> min 
     </td> 
    </tr> 
    </tbody> 
</table> 
0

Используйте следующую последовательность:

  1. Преобразование раз в секундах (эпохи), используя StrToTime.
  2. сделать математику
  3. Преобразовать в человеческий формат, используя дату или не gmdate

Нет необходимости в промежуточных переменных, список, и указываете ей взорвется.

Работа оригинала: https://eval.in/207141

Решение: https://eval.in/207145

<pre> 
<?php 
// test vector 
$dbs[] = ['record_created'=>'20141201', 'record_sign_in'=>'09:30', 'record_sign_out'=>'18:30']; 
$dbs[] = ['record_created'=>'20141202', 'record_sign_in'=>'09:30', 'record_sign_out'=>'18:30']; 
$dbs[] = ['record_created'=>'20141203', 'record_sign_in'=>'09:25', 'record_sign_out'=>'18:30']; 
$dbs[] = ['record_created'=>'20141204', 'record_sign_in'=>'09:35', 'record_sign_out'=>'18:30']; 
$dbs[] = ['record_created'=>'20141205', 'record_sign_in'=>'09:50', 'record_sign_out'=>'18:30']; 
$dbs = json_decode (json_encode ($dbs), FALSE); // convert to object for compatibility with code below 
?> 
<table width="39%" border="1"> 
    <tbody> 
    <tr> 
     <td style="padding: 8px;"><strong>Day</strong></td> 
     <td style="padding: 8px;"><strong>Total Hours</strong></td> 
    </tr> 
    <?php 
      $tally = 0; // total time 
      foreach($dbs as $row){ // statement slightly modified for test purpose 
       // convert to seconds 
       $created = strtotime($row->record_created); 
       // conversion and math 
       $seconds = strtotime($row->record_sign_out) - strtotime($row->record_sign_in); // time difference in seconds 
       $tally += $seconds; 
       // human format 
       $day = date("l", $created); 
       $hours = gmdate("H", $seconds); 
       $minutes = gmdate("i", $seconds); 
     ?> 
    <tr> 
     <td style="padding: 8px;"><?php echo $day; ?></td> 
     <td style="padding: 8px;"><?php echo $hours; ?> hrs <?php echo $minutes; ?> min</td> 
    </tr> 
    <?php } 
     // human format 
     $hours = floor($tally/3600); 
     $minutes = gmdate("i", $tally); 
    ?> 
    <tr> 
     <td style="padding: 8px;">Total</td> 
     <td style="padding: 8px;"><?php echo $hours; ?> hrs <?php echo $minutes; ?> min</td> 
    </tr> 
    </tbody> 
</table> 
Смежные вопросы