计算时间值的 SUM() 以字符串形式返回时间值

Posted

技术标签:

【中文标题】计算时间值的 SUM() 以字符串形式返回时间值【英文标题】:Calculating SUM() of time values returns the time value as a string 【发布时间】:2021-12-11 18:05:40 【问题描述】:

我有一个查询,它返回我的数据库表中所有“总计”字段的总和。查询:

public function findHoursTotal($user)

    return $this->createQueryBuilder('h')
        ->where('h.user = :user')
        ->andWhere('h.date BETWEEN :start AND :end')
        ->select("SUM(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();

查询按预期工作,但我无法正确获取格式。

total 字段为 TIME,包含以下值:

01:24:00
01:00:00

查询将返回总和为 12400。

我尝试了 DATE_FORMAT() 但这返回 null:

->select("DATE_FORMAT(SUM(h.total), '%H:%:i%s')")

我试图在我的控制器中将字符串转换为日期格式,但 php 认为格式以秒为单位。

有谁知道如何从 H:i:s 中的查询中获取结果?

【问题讨论】:

您使用的是什么 rdbms,h.total 列的数据类型是什么? @SalmanA h.total 字段的数据类型是 Time 但查询返回一个字符串并且我使用 Phpmyadmin 【参考方案1】:

您不能将SUM 设为time 值。但是你可以转换TIME_TO_SEC,计算秒数,然后转换SEC_TO_TIME

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(total)))
FROM h
WHERE ...
-- should give you something similar to 02:24:00

【讨论】:

感谢您的遮阳篷。我正在尝试使该功能正常工作,因为我收到此错误:Error: Expected known function, got 'SEC_TO_TIME' 您使用的是什么数据库?这些函数在 mysql 中可用,所以应该不是问题。此外,这是原始查询。你需要做类似select("SEC_TO_TIME(SUM(TIME_TO_SEC(h.total)))") 是的,我在 phpmyadmin 中尝试了原始查询,它可以工作。只有 Symofny 没有重新调整函数 SEC_TO_TIME,所以我试图弄清楚。

以上是关于计算时间值的 SUM() 以字符串形式返回时间值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据时间戳值计算子列表的平均值?

字符串格式 s-s-rS 2008 的 dateTime 值的总和

第六期,聚合函数介绍!!!

第六期,聚合函数介绍!!!

第六期,聚合函数介绍!!!

mysql之聚合函数