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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:25:41