2017-10-31 7 views
0

私が取り組んでいるプログラムでは、ユーザーが各タスクの作業にどれくらいの時間を費やしているかを示す表があります。 Time On Task欄の総計を表示したいと思います。Mysql SUM()対PHPの通常の加算演算

tfootはwhileステートメントの外にあるため、私は総計を計算するために別のクエリを使用しています。このPenは、今のように見えます。

ご覧のとおり、$grandtotalの合計が$tasktimeの合計と等しくないという問題があります。どうすればこの作品を作れますか? PHPで

グランド合計クエリ

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

答えて

2

、あなたは"12:34:56am"のような文字列に$date_start$date_endを設定し、それらを引いています。減算は数字にのみ作用し、時間については何も知らないので、そのような文字列は数字12に変換されます。したがって、07:12:55から "05:14:33"を引くと、7-5が実行されているので、2が返されます。また、数字が0で始まる場合は、それは8進数として扱われ、0から7までの数字しか許可されません。したがって、08:または09:で始まる時刻は、8および9が有効数字ではないため、0として処理されます。

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に変換することを検討する必要があります。

+0

'$ total + = $ date_end - $ date_start;'私が通知を消した '+'を削除すると未定義の変数 '$ total'が得られます。あなたのコードの結果は整数です。最初の行は現在7200、2行目は6406です。 – Clark

+0

ループの前に変数を0に初期化する必要があります。 – Barmar

+0

おそらく、 'DateInterval'クラスを使うべきでしょう。 – Barmar

関連する問題