将秒数转换为含总小时数的时间格式问题求助
解决SQL Server中秒数转含总小时数的时间格式问题
你遇到的问题根源在于:DATEADD(ss, 秒数, 0)会将秒数累加到1900-01-01 00:00:00这个基准时间上,当秒数超过24小时(86400秒)时,日期会自动进位;而CONVERT(..., 108)格式只会提取当天的时分秒,导致大秒数被截断为当日小时数,出现数值越大时间戳越短的错误。
要得到包含总小时数的格式(如40:23:56),需要手动拆分秒数为总小时、分钟、秒,再拼接成目标字符串。
直接计算的SQL示例
SELECT CONCAT( FLOOR(147588 / 3600), ':', RIGHT('0' + CAST(FLOOR((147588 % 3600)/60) AS VARCHAR), 2), ':', RIGHT('0' + CAST(147588 % 60 AS VARCHAR), 2) ) AS 时长 UNION ALL SELECT CONCAT( FLOOR(63297 / 3600), ':', RIGHT('0' + CAST(FLOOR((63297 % 3600)/60) AS VARCHAR), 2), ':', RIGHT('0' + CAST(63297 % 60 AS VARCHAR), 2) ) UNION ALL SELECT CONCAT( FLOOR(67232 / 3600), ':', RIGHT('0' + CAST(FLOOR((67232 % 3600)/60) AS VARCHAR), 2), ':', RIGHT('0' + CAST(67232 % 60 AS VARCHAR), 2) ) UNION ALL SELECT CONCAT( FLOOR(97230 / 3600), ':', RIGHT('0' + CAST(FLOOR((97230 % 3600)/60) AS VARCHAR), 2), ':', RIGHT('0' + CAST(97230 % 60 AS VARCHAR), 2) )
执行后正确输出:
40:59:48 17:34:57 18:40:32 27:00:30
封装成函数复用
如果需要多次使用该转换逻辑,可以创建自定义函数:
CREATE FUNCTION dbo.SecondsToTotalHoursFormat(@seconds INT) RETURNS VARCHAR(20) AS BEGIN RETURN CONCAT( FLOOR(@seconds / 3600), ':', RIGHT('0' + CAST(FLOOR((@seconds % 3600)/60) AS VARCHAR), 2), ':', RIGHT('0' + CAST(@seconds % 60 AS VARCHAR), 2) ) END
使用函数的示例:
SELECT dbo.SecondsToTotalHoursFormat(147588) AS 时长 UNION ALL SELECT dbo.SecondsToTotalHoursFormat(63297) UNION ALL SELECT dbo.SecondsToTotalHoursFormat(67232) UNION ALL SELECT dbo.SecondsToTotalHoursFormat(97230)
内容的提问来源于stack exchange,提问作者Lorenzo Santarelli
相关产品推荐
相关产品推荐

