SQL Server中将varchar类型'hh:mm:ss'数据转为time实现求和的方法
实现方案说明
完全可行,核心分为两个步骤:先将合法的hh:mm:ss格式varchar转换为time类型,再通过中转秒数的方式实现求和(SQL Server原生不支持直接对time类型执行SUM聚合)。
步骤1:varchar转time类型
只要你的varchar字段值符合标准hh:mm:ss格式,可直接用以下函数转换:
- 确定字段无非法值时,用
CAST/CONVERT:-- 两种写法效果一致 SELECT CAST('09:15:30' AS TIME); SELECT CONVERT(TIME, '09:15:30', 108); -- 108是hh:mm:ss格式的对应参数码 - 字段可能存在
25:00:00/00:70:00这类非法时间值时,用TRY_CAST/TRY_CONVERT,转换失败返回NULL,不会中断查询:SELECT TRY_CAST(异常时间字段 AS TIME) FROM 表名;
步骤2:对时间值执行求和运算
time类型不支持直接SUM聚合,需要先把时间转换为和00:00:00的差值(秒/毫秒均可,按需选精度),求和后再转回hh:mm:ss格式即可。
完整示例
假设你有业务表work_stat,存储员工每日工时的字段work_duration为varchar(8)类型,格式为hh:mm:ss,求和语句如下:
SELECT -- 将求和后的总秒数转换为hh:mm:ss格式,支持超过24小时的长时长 CONCAT( total_sec / 3600, ':', RIGHT('0' + CAST((total_sec % 3600) / 60 AS VARCHAR(2)), 2), ':', RIGHT('0' + CAST(total_sec % 60 AS VARCHAR(2)), 2) ) AS total_work_duration FROM ( -- 子查询:转换时间并计算总秒数和 SELECT SUM( DATEDIFF(SECOND, '00:00:00', TRY_CAST(work_duration AS TIME)) ) AS total_sec FROM work_stat -- 可选:过滤转换失败的非法数据 WHERE TRY_CAST(work_duration AS TIME) IS NOT NULL ) AS temp_calc;
注意事项
- 如果你确认求和后的总时长不会超过24小时,也可以用更简单的写法转time:
SELECT DATEADD(SECOND, total_sec, CAST('00:00:00' AS TIME)) FROM 子查询,但总秒数超过86400时会触发报错。 - 如果你的varchar格式带毫秒(如
hh:mm:ss.fff),把DATEDIFF的单位替换为MILLISECOND,后续转换逻辑对应调整精度即可。
内容的提问来源于stack exchange,提问作者Brian Campbell
相关产品推荐
相关产品推荐

