В программе, над которой я работаю, у меня есть таблица, которая показывает, сколько времени пользователь тратит на работу над каждой задачей. Я хотел бы отобразить общий итог столбца 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>
В 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
,
Других решений пока нет …