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

如何在MySQL中计算HH:MM:SS格式时间列的总时长

嘿,这个问题我之前帮同事处理过,刚好能给你清晰的解决方案!

核心思路

MySQL的TIME类型本身只存储00:00:00到23:59:59的范围,直接求和的话超过24小时会被自动截断,所以我们得换个思路:先把每个时间转成秒数求和,再把总秒数转回带完整小时的HH:MM:SS格式。

具体SQL实现

假设你的表名为your_table,时间列是time,可以用下面的语句:

SELECT 
  CONCAT(
    LPAD(FLOOR(total_seconds / 3600), 2, '0'), ':',
    LPAD(FLOOR((total_seconds % 3600) / 60), 2, '0'), ':',
    LPAD(total_seconds % 60, 2, '0')
  ) AS total_duration
FROM (
  SELECT SUM(TIME_TO_SEC(`time`)) AS total_seconds 
  FROM your_table
) AS temp;

逐部分解释

  • TIME_TO_SEC(\time`):把每条记录的HH:MM:SS转换成对应的总秒数,比如01:30:00会变成5400`秒
  • SUM():计算所有秒数的总和,得到总时长的秒数
  • 内层子查询先算出总秒数,外层查询负责格式转换:
    • FLOOR(total_seconds / 3600):得到总小时数(用FLOOR确保是整数,不会出现小数)
    • (total_seconds % 3600):算出扣除整小时后剩下的秒数,再除以60得到分钟数
    • total_seconds % 60:得到最终剩余的秒数
    • LPAD(..., 2, '0'):保证小时、分钟、秒都是两位数字,比如1小时会显示成01,避免出现1:5:3这种不规范格式

简化情况(如果总时长不超过24小时)

如果你的业务场景里总时长肯定不会超过24小时,那可以用更简单的写法:

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(`time`))) AS total_duration FROM your_table;

但要注意,这个方法如果总时长超过24小时,会自动截断成当天的时间(比如25小时会显示成01:00:00),所以只适合短时长的场景。

举个例子:假设表中有两条记录23:00:00和02:30:00,总时长是25小时30分,用第一种方法会得到25:30:00,第二种方法只会得到01:00:00,所以根据你的需求选对应的写法就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:33:50