我创建了一个将持续时间转换为小时:分钟的查询。除非有负数,否则一切正常。以下示例应将 -.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)
将截断而不考虑符号,不像FLOOR
或CEILING
。
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;