SQL Server中如何将时长字段求和后转换为天数
核心原因
你遇到的sum报错是因为duration字段实际存储为varchar字符串类型,且存储的时长小时数超过24,无法直接转换为SQL Server原生的time/datetime类型做聚合计算。
最优实现方案
思路是先拆分每个时长的小时、分钟、秒,转换为总秒数求和后再转换为天数,计算逻辑高效且兼容大于24小时的时长格式:
-- 直接计算总天数(保留小数) SELECT SUM( -- 提取小时转秒 CAST(LEFT(duration, CHARINDEX(':', duration) - 1) AS INT) * 3600 -- 提取分钟转秒 + CAST(SUBSTRING(duration, CHARINDEX(':', duration) + 1, CHARINDEX(':', duration, CHARINDEX(':', duration) + 1) - CHARINDEX(':', duration) - 1) AS INT) * 60 -- 提取秒 + CAST(RIGHT(duration, 2) AS INT) ) / (24.0 * 3600) AS total_days FROM 你的表名
如果需要输出「天+小时+分钟+秒」的可读格式,可以用以下写法:
DECLARE @total_sec BIGINT -- 先计算总秒数 SELECT @total_sec = SUM( CAST(LEFT(duration, CHARINDEX(':', duration) - 1) AS INT) * 3600 + CAST(SUBSTRING(duration, CHARINDEX(':', duration) + 1, CHARINDEX(':', duration, CHARINDEX(':', duration) + 1) - CHARINDEX(':', duration) - 1) AS INT) * 60 + CAST(RIGHT(duration, 2) AS INT) ) FROM 你的表名 -- 转换为天时分秒格式 SELECT @total_sec / (24*3600) AS 天数, (@total_sec % (24*3600)) / 3600 AS 剩余小时, (@total_sec % 3600) / 60 AS 剩余分钟, @total_sec % 60 AS 剩余秒
注意事项
如果字段存在脏数据、格式不规范的情况,可以把所有CAST替换为TRY_CAST,异常格式的时长会返回NULL,你可以配合ISNULL自定义异常值的处理逻辑,避免查询报错。
内容的提问来源于stack exchange,提问作者user3061338
相关产品推荐
相关产品推荐

