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

时间:2017-07-31 20:44:26

标签: sql sql-server

我创建了一个将持续时间转换为小时:分钟的查询。除非有负数,否则一切正常。以下示例应将-.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) 

3 个答案:

答案 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)将截断,不考虑符号,与FLOORCEILING不同。