Mysql SUM()vs PHP正常加法算法

时间:2017-10-31 20:55:54

标签: php mysql sum

在我正在开发的程序中,我有一个表格,显示用户花费多少时间处理每项任务。我想显示列tfoot的总计。

由于$grandtotal在while语句之外,我使用不同的查询来计算总计。这个Pen代表了它现在的样子。

正如您所看到的,问题是$tasktime不等于所有$stots ="SELECT *, SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(te.date_end, te.date_start)))) AS Duration FROM taskentries"; $resultots=mysqli_query($db,$stots); $totaltime =mysqli_fetch_assoc($resultots); $grandtotal = $totaltime['Duration']; 的总和。我怎样才能做到这一点?

总计查询总数

    <table>
       <thead>
        <th>Task</th>
        <th>Date Start</th>
        <th>Date End</th>
        <th>Time On Task</th>
      </thead>
         <tfoot>
        <tr>
             <td th='Task'></td>
                <td th='Date Start'></td>
                <td th='Date End'>Grand Total</td>
                <td th=''>
                   <?php
          if($grandtotal < 0){
               echo '0';
          }else{
               echo $grandtotal;
          }?>

          </td>
        </tr>
      </tfoot>
      <tbody>

    <?php 
        $sql="SELECT * FROM taskentries";
         $result=mysqli_query($db,$sql);
         while($taskentry=mysqli_fetch_array($result)){ ?>
         <tr>
             <td th='Task'><?=$taskentry['task'];?></td>
                <td th='Date Start'><?=$taskentry['date_start'];?></td>
                <td th='Date End'><?=$taskentry['date_end'];?></td>
                 <td th='Time On Task'>
                 <?php 
                 $date_start = date("h:i:sa",strtotime($taskentry['date_start']));
                 $date_end =  date("h:i:sa",strtotime($taskentry['date_end']));
                 $tasktime = $date_end - $date_start; 
                 if($tasktime < 0){
                 echo '0';
                 }else{
                 echo $tasktime;
                 }?>
                 </td>
         </tr>
       <?php };?>
      </tbody>
    </table>

=(Reportitems!group1total.value +Reportitems!group3total.value )-Reportitems!group2total.value 

1 个答案:

答案 0 :(得分:2)

在PHP中,您将$date_start$date_end设置为"12:34:56am"之类的字符串,然后减去它们。减法只适用于数字,它对时间一无所知,因此像这样的字符串转换为数字12。所以,如果你减去&#34; 05:14:33&#34;从&#34; 07:12:55&#34;,它将返回2,因为它正在7-5。此外,当一个数字以0开头时,它被视为八进制,只允许从07的数字。因此,以08:09:开头的时间将被视为0,因为89不是有效数字。

strtotime()返回一个时间戳,即秒数,您应该减去这些时间戳而不是调用date()。然后你可以把它转换成时间。

         $date_start = strtotime($taskentry['date_start']);
         $date_end =  strtotime($taskentry['date_end']);
         $tasktime = max(0, $date_end - $date_start); // don't show negative times
         echo date("H:i:s", $tasktime");

请注意,date()用于打印转换为日期和时间,而非持续时间。如果$tasktime超过24小时,则无法给出正确答案。您应该考虑转换为DateInterval