2017-10-31 4 views
0

내가 작업하고있는 프로그램에서 사용자가 각 작업에 소비하는 시간을 보여주는 테이블이 있습니다. Time On Task 란의 총계를 표시하고 싶습니다.Mysql SUM() 대 PHP 정상 덧셈 산술

tfoot은 while 문 외부에 있으므로 다른 쿼리를 사용하여 총계를 계산합니다. 이 Pen은 현재의 모양을 나타냅니다.

위에서 볼 수 있듯이 $grandtotal은 모두 $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']; 

표 PHP에서

<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> 

답변

2

, 당신은 "12:34:56am" 같은 문자열로 $date_start$date_end을 설정 한 다음 전원을 뺀 것입니다. 빼기는 숫자에 대해서만 작동하며 시간에 대해서는 알지 못하므로 문자열은 12으로 변환됩니다. 따라서 "05:14:33"을 "07:12:55"에서 빼면 7-5 일을하기 때문에 2을 반환합니다. 또한 0으로 시작하는 숫자는 8 진수로 처리되며 0에서 7까지의 숫자 만 허용됩니다. 따라서 08: 또는 09:으로 시작하는 시간은 89이 유효한 숫자가 아니기 때문에 0으로 처리됩니다.

strtotime()은 초 단위의 시간 소인을 반환하므로 date()을 호출하는 대신 시간 소인을 뺍니다. 그런 다음 이것을 시간으로 변환 할 수 있습니다.

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"); 

하는 것으로. $tasktime이 24 시간을 초과하면 정답을주지 않습니다. DateInterval으로 변환하는 것이 좋습니다.

+0

'$ total + = $ date_end - $ date_start;'통지를'+'제거하면 정의되지 않은 변수'$ total'이 표시됩니다. 그리고 코드의 결과는 정수입니다. 첫 번째 행은 이제 7200이고 두 번째 행은 6406입니다. – Clark

+0

루프 이전에 변수를 '0'으로 초기화해야합니다. – Barmar

+0

아마도 'DateInterval' 클래스를 사용해야합니다. – Barmar