如何在SQL中将时长数值145351401转换为天、时、分、秒?
解决SQL中时长数值转换为天、小时、分钟、秒的问题
你之前用CAST(... AS TIME)的方法无法显示天数,是因为SQL的TIME类型仅能表示0-23小时范围内的时间,无法容纳超过24小时的时长,自然无法展示天数。以下提供两种可行的解决方案:
方案一:直接计算两个日期的差值(推荐)
既然你已经知道原始的两个日期,直接用DATEDIFF函数分别计算天、小时、分钟、秒的差值,再拼接成所需格式:
SELECT CONCAT( DATEDIFF(day, '2022-09-08 16:21:48.400', '2022-09-16 07:22:31.400'), '天 ', DATEDIFF(hour, '2022-09-08 16:21:48.400', '2022-09-16 07:22:31.400') % 24, '小时 ', DATEDIFF(minute, '2022-09-08 16:21:48.400', '2022-09-16 07:22:31.400') % 60, '分钟 ', DATEDIFF(second, '2022-09-08 16:21:48.400', '2022-09-16 07:22:31.400') % 60, '秒' ) AS 时长;
执行结果:7天 15小时 0分钟 43秒,完全符合预期。
方案二:基于时长数值转换(如果必须使用给定的数值)
假设你的数值是总毫秒数(如果是秒数就把除数/模数的1000去掉),通过整数除法和取余运算拆分各时间单位:
DECLARE @duration BIGINT = 145351401; -- 你的时长数值 SELECT CONCAT( FLOOR(@duration / 86400000), '天 ', FLOOR((@duration % 86400000) / 3600000), '小时 ', FLOOR((@duration % 3600000) / 60000), '分钟 ', FLOOR((@duration % 60000) / 1000), '秒 ', @duration % 1000, '毫秒' ) AS 时长;
如果你的数值是总秒数,调整为:
DECLARE @duration BIGINT = 145351; -- 示例总秒数 SELECT CONCAT( FLOOR(@duration / 86400), '天 ', FLOOR((@duration % 86400) / 3600), '小时 ', FLOOR((@duration % 3600) / 60), '分钟 ', @duration % 60, '秒' ) AS 时长;
说明
86400是一天的秒数(246060),86400000是一天的毫秒数%是取余运算符,用于获取当前单位剩余的时长FLOOR用于向下取整,确保得到整数的时间单位数
内容的提问来源于stack exchange,提问作者BigPicture
相关产品推荐
相关产品推荐

