Mysql SUM () против арифметики нормального сложения PHP

В программе, над которой я работаю, у меня есть таблица, которая показывает, сколько времени пользователь тратит на работу над каждой задачей. Я хотел бы отобразить общий итог столбца Time On Task,

поскольку tfoot находится за пределами оператора while, я использую другой запрос для вычисления общей суммы. это Ручка представляет, как это выглядит прямо сейчас.

Как видите, проблема в том, что $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'];

Таблица

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

0

Решение

В PHP вы настраиваете $date_start а также $date_end к строкам вроде "12:34:56am", а затем вычитая их. Вычитание работает только с числами, оно ничего не знает о времени, поэтому такая строка преобразуется в число 12, Так что если вы вычтете «05:14:33» из «07:12:55», он просто вернется 2 потому что это делает 7-5, Кроме того, когда число начинается с 0 это воспринимается как восьмеричное, что позволяет только цифры из 0 в 7, Итак, времена, которые начинаются с 08: или же 09: будет рассматриваться как 0, так как 8 а также 9 не являются действительными цифрами.

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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector