PHP MySQL中无法统计指定员工diff字段总时长问题
解决MySQL中“天:小时:分钟”格式字符串的求和问题
问题原因
直接用SUM(diff)得不到正确结果,是因为diff是varchar字符串类型,MySQL的SUM函数对字符串的处理逻辑不是按时间累加,而是按字符的ASCII码值求和,自然不符合你的需求。
解决方案
需要先把每个diff拆成天、小时、分钟三个数值,转换成总分钟数求和,再将总分钟数逆向转换回“天:小时:分钟”的格式:
- 拆分时间字段:用
SUBSTRING_INDEX函数提取diff中的天、小时、分钟部分 - 转换为总分钟数:将天转成分钟(1天=1440分钟)、小时转成分钟(1小时=60分钟),加上原分钟数,得到单条记录的总分钟数
- 求和并转换格式:对总分钟数求和后,计算出对应的天、小时、剩余分钟,拼接成目标格式
完整SQL语句
SELECT CONCAT( FLOOR(total_minutes / 1440), ':', FLOOR((total_minutes % 1440) / 60), ':', total_minutes % 60 ) AS total_time FROM ( SELECT SUM( IFNULL(SUBSTRING_INDEX(diff, ':', 1), 0) * 1440 + IFNULL(SUBSTRING_INDEX(SUBSTRING_INDEX(diff, ':', 2), ':', -1), 0) * 60 + IFNULL(SUBSTRING_INDEX(diff, ':', -1), 0) ) AS total_minutes FROM employee_time WHERE em_id = '1170' ) AS temp;
结果验证
针对你提供的两条数据:
- 第一条
1:2:0转换为总分钟:1*1440 + 2*60 + 0 = 1560分钟 - 第二条
0:2:5转换为总分钟:0*1440 + 2*60 + 5 = 125分钟 - 总和:
1560 + 125 = 1685分钟 - 转换回格式:
1685//1440=1天,剩余245分钟;245//60=4小时,剩余5分钟 → 最终结果为1:4:5,符合预期。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

