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
相关产品推荐
相关产品推荐

