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

TSQL中将VARCHAR格式HH:MM:SS.mmm转为TIME类型失败求助

解决VARCHAR转TIME类型的报错问题

我来帮你分析下问题所在,以及给出可行的解决方案~

首先,你遇到的报错原因很明确:执行select cast(stuff(stuff('15600.02',5,0,':'),3,0,':') as time)后,生成的字符串是'15:60:00.02',而SQL的TIME类型要求分钟范围必须是0-59,60是非法的时间分量,所以转换失败了。

接下来针对你的需求,分两种常见场景给出解决方案:

场景1:原始值是去掉冒号的HHMMSS.mmm格式

比如15600.02实际代表15:60:00.02,需要先修正非法的时间分量(把超过59的分钟/秒转换为更高层级的时间单位),再转换为TIME类型:

DECLARE @input VARCHAR(20) = '15600.02'

-- 分离整数部分(HHMMSS)和毫秒部分
DECLARE @intPart VARCHAR(6) = LEFT(@input, CHARINDEX('.', @input + '.') - 1)
DECLARE @msPart VARCHAR(3) = RIGHT('00' + SUBSTRING(@input, CHARINDEX('.', @input) + 1, 3), 3)

-- 补前导零到6位,确保符合HHMMSS结构
SET @intPart = RIGHT('000000' + @intPart, 6)

-- 拆分小时、分钟、秒
DECLARE @HH INT = CAST(LEFT(@intPart, 2) AS INT)
DECLARE @MM INT = CAST(SUBSTRING(@intPart, 3, 2) AS INT)
DECLARE @SS INT = CAST(RIGHT(@intPart, 2) AS INT)

-- 修正非法的时间分量:将超过60的分钟转成小时,超过60的秒转成分钟
SET @HH = @HH + @MM / 60
SET @MM = @MM % 60
SET @MM = @MM + @SS / 60
SET @HH = @HH + @MM / 60
SET @MM = @MM % 60
SET @SS = @SS % 60

-- 拼接成合法的时间字符串并转换
DECLARE @validTimeStr VARCHAR(12) = CONCAT(
    RIGHT('0' + CAST(@HH AS VARCHAR), 2), ':',
    RIGHT('0' + CAST(@MM AS VARCHAR), 2), ':',
    RIGHT('0' + CAST(@SS AS VARCHAR), 2), '.',
    @msPart
)

SELECT CAST(@validTimeStr AS TIME) AS ConvertedTime

这段代码会把15600.02转换成合法的16:00:00.020(把60分钟转换成1小时,加到原有的15小时上)。

场景2:原始值是总秒数(含毫秒)

如果15600.02实际代表15600.02秒,可以直接通过时间偏移的方式转换:

DECLARE @input VARCHAR(20) = '15600.02'
SELECT CAST(DATEADD(MILLISECOND, CAST(ROUND(CAST(@input AS FLOAT) * 1000, 0) AS INT), 0) AS TIME) AS ConvertedTime

这段代码会得到04:20:00.020(15600秒等于4小时20分钟,0.02秒等于20毫秒)。

你可以根据原始数据的实际含义选择对应的方案哦~

内容的提问来源于stack exchange,提问作者Manas Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:18:12