如何实现两个时间量相加?使用dateadd未成功,请求技术支持
解决时间量相加问题
这类time类型的时间量直接用+运算符相加确实不被支持,DATEADD函数是给日期/时间点添加时间间隔,而非对两个时间段做加法。以下提供两种可行的实现方案(以SQL Server为例):
方案1:转换为微秒总数计算后转回time类型
将两个time值转换为从0点开始的微秒总数,相加后再转换回time类型,代码如下:
DECLARE @time1 time(7) = '01:52:00.0000000'; DECLARE @time2 time(7) = '00:59:00.0000000'; SELECT CAST( DATEADD(MICROSECOND, DATEDIFF(MICROSECOND, '00:00:00.0000000', @time1) + DATEDIFF(MICROSECOND, '00:00:00.0000000', @time2), '00:00:00.0000000' ) AS time(7) ) AS Result;
执行后会得到预期结果 02:51:00.0000000。
方案2:拆分时分秒微秒分别计算进位
手动拆分两个时间的时、分、秒、微秒部分,分别相加后处理进位逻辑,代码如下:
DECLARE @t1 time(7) = '01:52:00.0000000'; DECLARE @t2 time(7) = '00:59:00.0000000'; -- 拆分各时间分量 DECLARE @h1 INT = DATEPART(HOUR, @t1), @h2 INT = DATEPART(HOUR, @t2); DECLARE @m1 INT = DATEPART(MINUTE, @t1), @m2 INT = DATEPART(MINUTE, @t2); DECLARE @s1 INT = DATEPART(SECOND, @t1), @s2 INT = DATEPART(SECOND, @t2); DECLARE @ms1 INT = DATEPART(MICROSECOND, @t1), @ms2 INT = DATEPART(MICROSECOND, @t2); -- 处理微秒进位 DECLARE @total_ms INT = @ms1 + @ms2; DECLARE @carry_s INT = @total_ms / 1000000; SET @total_ms = @total_ms % 1000000; -- 处理秒进位 DECLARE @total_s INT = @s1 + @s2 + @carry_s; DECLARE @carry_m INT = @total_s / 60; SET @total_s = @total_s % 60; -- 处理分进位 DECLARE @total_m INT = @m1 + @m2 + @carry_m; DECLARE @carry_h INT = @total_m / 60; SET @total_m = @total_m % 60; -- 计算总小时 DECLARE @total_h INT = @h1 + @h2 + @carry_h; -- 拼接并转换为time类型 SELECT CAST( CONCAT( RIGHT('0' + CAST(@total_h AS VARCHAR), 2), ':', RIGHT('0' + CAST(@total_m AS VARCHAR), 2), ':', RIGHT('0' + CAST(@total_s AS VARCHAR), 2), '.', RIGHT('000000' + CAST(@total_ms AS VARCHAR), 6) ) AS time(7) ) AS Result;
该方案逻辑直观,适合理解时间相加的底层进位规则,结果与方案1一致。
注意事项
如果相加后的总时长超过24小时,time类型会自动对24取模(例如25小时会显示为01:00:00.0000000)。若需保留超过24小时的完整时长,建议改用DATETIME类型存储,或单独记录总小时、分钟数。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

