如何在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
相关产品推荐
相关产品推荐

