You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库TIME类型字段SUM求和后如何转换为H:i:s时间格式

问题原因

  • MySQL 直接对 TIME 类型字段执行 SUM() 聚合时,会将时间值转换为 HHMMSS 格式的整数返回,比如示例中的 01:24:00 会转为 12400,该结果既不是秒数也不是标准时间类型,因此直接用 DATE_FORMAT() 处理会返回 null。
  • 你写的 DATE_FORMAT 格式串存在语法错误,'%H:%:i%s' 多了多余的冒号,正确格式应为 '%H:%i:%s',但即使修正格式也无法处理 SUM() 返回的整数结果。

解决方法

方法1:SQL 层面处理(推荐)

先将 TIME 字段转为秒数求和,再转回 TIME 格式即可。需要注意 Doctrine 默认不支持 TIME_TO_SEC、SEC_TO_TIME 这类 MySQL 自定义函数,需要先安装 beberlei/doctrineextensions 扩展包注册相关函数,或者使用原生 SQL 查询。
修改后的查询代码:

public function findHoursTotal($user)
{
    return $this->createQueryBuilder('h')
        ->where('h.user = :user')
        ->andWhere('h.date BETWEEN :start AND :end')
        // 先将每个时间值转为秒数求和,再转回标准TIME格式
        ->select("SEC_TO_TIME(SUM(TIME_TO_SEC(h.total)))")
        ->setParameter('user', $user)
        ->setParameter('start', new \DateTime("midnight first day of this month"))
        ->setParameter('end', new \DateTime("Last day of this month"))
        ->getQuery()
        ->getSingleScalarResult();
}

该方法直接返回 H:i:s 格式的字符串,即使总时长超过 24 小时也能正常处理。

方法2:PHP 层面处理

如果不想调整查询逻辑或安装额外扩展,可以直接对返回的整数值做格式化处理:

// 拿到查询返回的整数值,比如12400
$sumResult = $this->findHoursTotal($user);
$hours = floor($sumResult / 10000);
$minutes = floor(($sumResult % 10000) / 100);
$seconds = $sumResult % 100;
// 补前导零格式化输出
$formattedTime = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);

如果总时长可能超过 100 小时,把格式化规则中 %02d 的 2 改为你需要的最大位数即可。


内容的提问来源于stack exchange,提问作者DeerBeast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:04