我这里有一个获取列平均值的mysql查询(列数据类型为' time')。例如,列值为: 00:00:55,00:00:59,00:01:03
SELECT AVG(TIME_TO_SEC(column_name)) FROM table_name)AS average_result
在我的Php中,我用这种方式格式化了结果:
<?php foreach($display_average as $da){
echo date("H:i:s", ($da["average_result"]));
}
?>
输出:08:00:59而不是00:00:59,为什么从08开始?还是我错过了什么?谢谢!
答案 0 :(得分:2)
PHP的日期/时间函数和MySQL的日期/时间数据类型都处理挂钟时间戳,而不是持续时间;即00:00:55
表示午夜过了五十五秒。这不是你想要的;您无法处理超过23小时59分59秒的持续时间,因为您使用的数据类型和功能正在处理时钟时间,不能超过这些值。
您的具体问题源于时区设置。更大的问题是您需要存储表示经过的秒数或分钟数的简单整数值;不是时间戳。要在PHP中将其格式化为人类可读的字符串,您可以使用DateInterval
class。
答案 1 :(得分:0)
请参阅php manul,关于date_default_timezone_set
您的时区是+8
PHP的默认date.timezone
是utc,你可以将其更改为date.timezone = PRC
date_default_timezone_set('UTC');
echo date("H:i:s", 59);//00:00:59
//date_default_timezone_set('RPC');
//echo date("H:i:s", 59);//08:00:59
答案 2 :(得分:0)
始终采用标准/正式方法。但无论如何你需要自定义,那么你几乎可以通过编程完成所有工作。我们走了
从数据库中获取您的数字时间(您提交时间的秒数)
SELECT
AVG
(
HOUR(column_name) * 3600
+ MINUTE(column_name) * 60
+ SECOND(column_name)
) AS numeric_average_result FROM table_name
现在您可以将秒数转换为适当的时间
foreach($display_average as $da)
{
$r = numToTime($da["numeric_average_result"]);
echo "<br>".$r;
}
function numToTime($num)
{
$seconds = $num%60;
$num = (int)($num/60);
$minutes = $num%60;
$hours = (int)($num/60);
return make2digit($hours).":".make2digit($minutes).":".make2digit($seconds);
}
function make2digit($val)
{
if(strlen($val) == 1)
return "0".$val;
else
return $val;
}