2017-07-31 104 views
0

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

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

持续时间字段的数据类型是什么?或者是两个日期时间字段之间的计算? – Eli

+0

这是一个数字字段 – user1345246

回答

0

我只想用例的解决方案...

declare @value float = -0.5 

select CASE WHEN @value > 0 THEN CAST(FLOOR(sum(@value)) AS VARCHAR(3)) 
      ELSE CAST(-FLOOR(sum([email protected])) 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) 
+0

尝试'-0.1'。预期结果:'-0:06'。实际结果:'-0:54'。 –

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; 
+0

尝试'-0.1'。预期结果:'-0:06'。实际结果:'0:06'。 –

+0

@Jeroen Mostert是的你是对的,我更新了我的答案,谢谢你 – sepupic

0

这假定您希望将持续时间整数分钟;例如,一个1.999持续时间应因为119.94分钟被呈现为2:00舍入到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)将截断而不考虑符号,不像FLOORCEILING

相关问题