我创建了一个将持续时间转换为小时:分钟的查询。除非有负数,否则一切正常。以下示例应将-.50转换为-0:30,因为我使用的是它转换为-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)
答案 0 :(得分:0)
我只是简单地使用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 :(得分:0)
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;
答案 2 :(得分:0)
这假定你想要将持续时间缩短到整分钟;例如,1.999
的持续时间应显示为2:00
,自119.94分钟到120,而1.99
应为1:59
,因为119.4分钟到119。
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
不同。