在我正在开发的程序中,我有一个表格,显示用户花费多少时间处理每项任务。我想显示列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
答案 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
开头时,它被视为八进制,只允许从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
。