【问题标题】:How to find total work hours for certain period of time using PHP如何使用PHP查找特定时间段的总工作时间
【发布时间】:2017-07-11 06:44:12
【问题描述】:

我有一个简单的表查询,如下所示:

SELECT uid, dates, time_in, time_out,
TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(time_out)-TIME_TO_SEC(time_in))),'%H:%i') as 
total_wh FROM tb_attendance WHERE uid=10012 AND dates BETWEEN '2017-02-01' AND
'2017-02-07' GROUP BY dates

这将输出如下表:

uid     dates       time_in     time_out    work_hours
10012   2017-02-01  07:07:02    15:56:48    08:49
10012   2017-02-02  07:13:13    07:13:13    00:00
10012   2017-02-03  06:55:35    06:55:35    00:00
10012   2017-02-06  06:45:50    06:45:50    00:00
10012   2017-02-07  06:53:19    16:06:36    09:13
                 Grand Total                ?????

我需要使用 PHP 在问号中找到总工作时间。到目前为止,我一直在尝试这些代码,但它返回的值不正确。

`echo"<table><tr><td>uid</td><td>dates</td><td>time_in</td><td>time_out</td><td>work_hours</td></tr>";

$totalwh=0;
while($row=mysql_fetch_array($sql)){
echo"<tr><td>".$row['uid']."</td>";
echo"<td>".$row['dates']."</td>";
echo"<td>".$row['time_in']."</td>";
echo"<td>".$row['time_out']."</td>";
echo"<td>".$row['total_wh']."</td>";
echo"</tr>";

$workhours=explode(":",$row['total_wh']);

$totalwh+=$workhours[0]*60;
$totalwh+=$workhours[1];
$hours = $totalwh / 60;
$minutes = $totalwh % 60;

}

$x=date('H:i',strtotime("$hours:$minutes"));

echo"<tr><td colspan=4 align='center'>Grand Total </td><td>".$x."</td></tr>
</table>";
`

请帮忙!

【问题讨论】:

    标签: php mysql sql database datetime


    【解决方案1】:

    我建议以秒为单位计算总时间,然后将秒数格式化为日期表示字符串。这种格式化可以用函数 gmdate()

    来完成

    http://php.net/manual/en/function.gmdate.php

    可以使用查询函数之一直接从数据库中获取以秒为单位的时间,也可以执行以下操作。

    <?php
    
    //Store total time in seconds
    $totalTimeSeconds = 0;
    
    //Loop over rows
    while($row=mysql_fetch_array($sql)){
        //Output row
    
        //Split total working hours into hours and minutes
        $time = explode(":", $row['total_wh']);
        $timeHours = $time[0];
        $timeMinutes = $time[1];
    
        //Convert and add hours/minutes to total time 
        $totalTimeSeconds += ($timeHours * 60 * 60);
        $totalTimeSeconds += ($timeMinutes * 60);
    }
    
    //Output formatted total time in seconds
    gmdate("H:i:s", $totalTimeSeconds);
    

    希望这会有所帮助!

    【讨论】:

    • 很高兴它有帮助,请将我的答案标记为正确。谢谢
    • @AhyasWidyatmaka 如果您喜欢此解决方案,请接受它。人们花时间帮助别人,不接受他们的回答,被认为是粗鲁的。
    【解决方案2】:

    试试这个

    SELECT uid, dates, time_in, time_out,SEC_TO_TIME(SUM(TIME_TO_SEC(time_out)-TIME_TO_SEC(time_in))) as
    total_wh FROM tb_attendance WHERE uid=10012 AND dates BETWEEN '2017-02-01' AND '2017-02-07' GROUP BY dates
    

    只需替换

    TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(time_out)-TIME_TO_SEC(time_in))),'%H:%i') as total_wh
    

    SEC_TO_TIME(SUM(TIME_TO_SEC(time_out)-TIME_TO_SEC(time_in))) as total_wh
    

    输出为

    我想它会对你有所帮助。

    【讨论】:

      【解决方案3】:

      你像这样改变你的代码

           <?php
                      echo "<table>
                  <tr><td>uid</td>
                      <td>dates</td>
                      <td>time_in</td>
                      <td>time_out</td>
                      <td>work_hours</td></tr>";
      
                      $totalwh=0;            
                      while($row=mysql_fetch_array($sql)){
                      echo"<tr><td>".$row['uid']."</td>";
                      echo"<td>".$row['dates']."</td>";
                      echo"<td>".$row['time_in']."</td>";
                      echo"<td>".$row['time_out']."</td>";
                      echo"<td>".$row['total_wh']."</td>";
                      echo"</tr>";
      
                      $time_arr[] = $row['total_wh'];
      
                      }
      
                      function explode_time($time) { //explode time and convert into seconds
                  $time = explode(':', $time);
                  $time = $time[0] * 3600 + $time[1] * 60;
                  return $time;
          }
      
          function second_to_hhmm($time) { //convert seconds to hh:mm
                  $hour = floor($time / 3600);
                  $minute = strval(floor(($time % 3600) / 60));
                  if ($minute == 0) {
                      $minute = "00";
                  } else {
                      $minute = $minute;
                  }
                  $time = $hour . ":" . $minute;
                  return $time;
          }
      
          $time = 0;
           foreach ($time_arr as $time_val) {
              $time +=explode_time($time_val); // this fucntion will convert all hh:mm to seconds
          }
      
      
       echo"<tr><td colspan=4 align='center'>Grand Total </td><td>".second_to_hhmm($time)."</td></tr>
                      </table>";
                      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        相关资源
        最近更新 更多