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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:15:00