尝试在 sql 中将持续时间转换为小时:分钟



我创建了一个将持续时间转换为小时:分钟的查询。除非有负数,否则一切正常。以下示例应将 -.50 转换为 -0:30,因为我使用的是 floor 它转换为 -1:30。持续时间可以是正数或负数的混合,所以我不能只乘以 -1。这是我的查询

select CAST(FLOOR(sum(-.50)) AS VARCHAR(3)) + ':' + RIGHT('00'+ 
CAST(CAST(ROUND(( sum(-.50)- CAST(FLOOR(sum(-.50)) AS NUMERIC(8,4)) ) * 
60.000,0) AS INT) AS VARCHAR(2)),2) 

我会简单地使用 CASE 作为解决方案......

declare @value float = -0.5
select CASE WHEN @value > 0 THEN CAST(FLOOR(sum(@value)) AS VARCHAR(3)) 
ELSE CAST(-FLOOR(sum(-@value)) AS VARCHAR(3)) END + ':' + 
RIGHT('00'+ CAST(CAST(ROUND(( sum(@value)- CAST(FLOOR(sum(@value)) AS NUMERIC(8,4)) ) * 60.000,0) AS INT) AS VARCHAR(2)),2) 

非常相似的解决方案,没有一个表达式是

select CAST(CASE WHEN @value > 0 THEN 1 ELSE -1 END * FLOOR(sum(abs(@value))) AS VARCHAR(3)) + ':' + 
RIGHT('00'+ CAST(CAST(ROUND(( sum(@value)- CAST(FLOOR(sum(@value)) AS NUMERIC(8,4)) ) * 60.000,0) AS INT) AS VARCHAR(2)),2) 

这假定您希望将持续时间舍入为整分钟;例如,持续时间1.999应显示为从 119.94 分钟舍入到 120 的2:00,而1.99应自 119.4 分钟舍入到 1191:59

SELECT 
REPLACE(
CONVERT(DECIMAL(8, 2), 
ROUND(ROUND(SUM(dur) * 60, 0) / 60, 0, 1) + 
ROUND(SUM(dur) * 60, 0) % 60 / 100
), 
'.', ':'
)

请注意在小时部分使用ROUND的截断模式:ROUND(number, 0, 1)将截断而不考虑符号,不像FLOORCEILING

declare @t table (dur decimal(8,2));
insert @t values ( -0.1), (2), (-2);
select case when sum(dur) < 0 then '-' else '' end +
cast(abs(cast(60 * sum(dur) as int)) / 60  as varchar(10)) + ':' +
right('00' + cast(abs(cast(60 * sum(dur) as int)) % 60 as varchar(2)), 2) as [hh:mm]
from @t; 

最新更新