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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:27:03