SQL如何计算表中所有行两个时间列的差值并汇总总时长
解决方法
核心思路
逐行计算resumetime与pausetime的时间差后求和,优先使用DATEDIFF函数计算差值避免跨天场景出错。
具体实现
1. 直接查询总间隔数值(按需选择时间单位)
你可以根据精度需求选择秒、毫秒作为计算单位:
SELECT -- 总间隔秒数,不需要毫秒精度可以只保留这个字段 SUM(DATEDIFF(SECOND, pausetime, resumetime)) AS total_duration_second, -- 总间隔毫秒数,需要高精度时使用 SUM(DATEDIFF(MILLISECOND, pausetime, resumetime)) AS total_duration_ms FROM 替换为你的实际表名;
2. 转换为易读的时分秒格式
如果需要把总时长格式化为X小时X分钟X秒的可读格式,可以用变量先存总差值再格式化:
DECLARE @total_ms BIGINT -- 先计算所有行的总间隔毫秒数 SELECT @total_ms = SUM(DATEDIFF(MILLISECOND, pausetime, resumetime)) FROM 替换为你的实际表名; -- 格式化输出 SELECT CAST(@total_ms / 3600000 AS VARCHAR) + '小时' + CAST((@total_ms % 3600000) / 60000 AS VARCHAR) + '分钟' + CAST((@total_ms % 60000) / 1000 AS VARCHAR) + '秒' + CAST(@total_ms % 1000 AS VARCHAR) + '毫秒' AS 总暂停时长
原写法问题说明
- 将
datetime类型强制转为time类型会丢失日期信息,若暂停和恢复时间跨天会得到完全错误的差值 - 没有使用
SUM聚合函数对所有行的差值做汇总,自然无法得到所有行的总间隔
内容的提问来源于stack exchange,提问作者Ankush yadav
相关产品推荐
相关产品推荐

