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

SQL Server中NVARCHAR格式时长转decimal及转换报错问题咨询

SQL Server中HH:MM格式时长文本转十进制小时数实现方案

转换逻辑与代码实现

核心思路是把WorkedHours按冒号分割为小时、分钟两部分,小时部分直接取数值,分钟部分除以60换算为小时小数,两者相加即可得到目标结果:

基础版(仅适配合规格式数据)

如果确认表中所有WorkedHours都严格符合HH:MM格式,直接使用以下查询:

SELECT
    WorkedHours,
    -- 可根据需求调整DECIMAL的精度位数
    CAST(LEFT(WorkedHours, CHARINDEX(':', WorkedHours) - 1) AS DECIMAL(4,2))
    + CAST(RIGHT(WorkedHours, LEN(WorkedHours) - CHARINDEX(':', WorkedHours)) AS DECIMAL(4,2)) / 60
    AS WorkedHoursDecimal
FROM 你的表名

兼容异常值版(避免非法格式报错)

如果存在空值、格式不符合要求的数据,使用TRY_CAST和条件判断兼容异常场景,非法格式会返回NULL,可自行修改为默认值:

SELECT
    WorkedHours,
    CASE
        WHEN WorkedHours LIKE '%:%'
            AND ISNUMERIC(LEFT(WorkedHours, CHARINDEX(':', WorkedHours) -1)) = 1
            AND ISNUMERIC(RIGHT(WorkedHours, LEN(WorkedHours) - CHARINDEX(':', WorkedHours))) = 1
        THEN
            TRY_CAST(LEFT(WorkedHours, CHARINDEX(':', WorkedHours) - 1) AS DECIMAL(4,2))
            + TRY_CAST(RIGHT(WorkedHours, LEN(WorkedHours) - CHARINDEX(':', WorkedHours)) AS DECIMAL(4,2)) / 60
        ELSE NULL -- 可替换为0或其他你需要的默认值
    END AS WorkedHoursDecimal
FROM 你的表名

「从值为0的字符转换为int类型报错」原因说明

该报错通常由以下两种场景触发:

  • 分割字符串逻辑异常拿到空值:当WorkedHours存在不符合HH:MM格式的内容(比如:30、9:、空字符串、单个字符0等),没有判断冒号存在就执行分割逻辑会得到空字符串,SQL Server中将空字符串强转为INT时会隐式尝试映射为数值0,嵌套运算场景下就会触发该转换报错。
  • 错误的时间类型转INT逻辑:如果你采用了先把WorkedHours转为TIME类型、再直接强转TIME为INT的方案,TIME类型的底层存储结构和INT不兼容,当值为00:00:00(时长为0)时,直接转换操作就会抛出该错误。

内容的提问来源于stack exchange,提问作者Dave Hughes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:03