在SQL中使用负数时将分钟转换为HH:MM

时间:2017-10-06 14:52:02

标签: sql sql-server

我正在努力解决员工在数小时内使用数据库中的计算字段工作的时间或工作时间。我有一些代码将分钟格式化为HH:MM并且它与正数一起工作正常但是当它是负数时,它无法正常工作。

RIGHT('0' + CAST (FLOOR(COALESCE (NO_MINS, 0) / 60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(COALESCE (NO_MINS, 0) % 60) AS VARCHAR (2)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR((NO_MINS* 60) % 60) AS VARCHAR (2)), 2) 

示例结果:

积极时:04:33:00

负数时:-2:0 *:00

这可能吗?

使用SQL Server 2012。

2 个答案:

答案 0 :(得分:1)

尽可能少地修改你的例子,并指出“当正面而非负面时它起作用”的概念意味着“使用abs”。

Declare @NO_MINS int

set @NO_MINS = 200

select
case when @NO_MINS < 0 then '-' else '' end +
RIGHT('0' + CAST (FLOOR(abs(COALESCE (@NO_MINS, 0)) / 60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(abs(COALESCE (@NO_MINS, 0)) % 60.0) AS VARCHAR (2)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(abs((@NO_MINS* 60) % 60.0)) AS VARCHAR (2)), 2) 

set @NO_MINS = -200

select
case when @NO_MINS < 0 then '-' else '' end +
RIGHT('0' + CAST (FLOOR(abs(COALESCE (@NO_MINS, 0)) / 60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(abs(COALESCE (@NO_MINS, 0)) % 60) AS VARCHAR (2)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(abs((@NO_MINS* 60) % 60)) AS VARCHAR (2)), 2) 

现在,值得一提的是整数分钟,如果这是你的字段所包含的,将永远不会给你任何秒数,所以第二次计算可以删除并替换为'00'。

case when NO_MINS < 0 then '-' else '' end +
RIGHT('0' + CAST (FLOOR(abs(COALESCE (NO_MINS, 0)) / 60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(abs(COALESCE (NO_MINS, 0)) % 60) AS VARCHAR (2)), 2) + ':00'

答案 1 :(得分:0)

你可以用它。简单易行。

CASE WHEN NO_MINS < 0 THEN '-' ELSE '' END 
     + CONVERT(VARCHAR(8), DATEADD( MINUTE, ABS(ISNULL( NO_MINS, 0 ) ), '00:00:00'), 108 )