将数字转换为小时(ROUND问题)

时间:2014-12-02 13:42:34

标签: sql sql-server

我想将一个数字转换为小时..我的代码正在这样做,但并非100%正确。 数字2.98是2小时和0.98 * 60 = 58分钟..我希望这个分钟到59分 我希望我的结果在我的代码+02:59中,没有这个小圆就是+02:58。

任何人都知道如何在我的代码中计算时间?

DECLARE @number_hours FLOAT = 2.98

--if number is negative
IF(@number_hours) < 0
BEGIN
    SET @number_hours = @number_hours*-1
    PRINT '-'+ CONVERT(varchar(5), CONVERT(DATETIME, @number_hours/24), 108)
END
ELSE
    PRINT '+'+ CONVERT(varchar(5), CONVERT(DATETIME, @number_hours/24), 108)

4 个答案:

答案 0 :(得分:1)

如果你想要四舍五入到最接近的分钟,你需要先将你的小数小时数舍入到最接近的分钟,所以像这样:

DECLARE @number_hours FLOAT = 2.98

--if number is negative
IF(@number_hours) < 0
BEGIN
    SET @number_hours = @number_hours*-1
    PRINT '-'+ CONVERT(varchar(5), CONVERT(DATETIME, ROUND(@number_hours * 60, 0)/(24.0 * 60)), 108)
END
ELSE
    PRINT '+'+ CONVERT(varchar(5), CONVERT(DATETIME, ROUND(@number_hours * 60, 0)/(24.0 * 60)), 108)

答案 1 :(得分:0)

你可以试试这个

DECLARE @f [real]
SET @f = 2.98

SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, 
                                  DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME)))

输出: - 02:58:00.0000000

答案 2 :(得分:0)

您可以使用数学计算来修复它:

select 2.98
       + iif
         ( 2.98 % (1/60.0) > 0 -- check if remainder > 0
         , (1/60.0) - 2.98 % (1/60.0) -- round up
         , 0 -- it's already rounded, keep it as is
         )

分裂的其余部分需要一分钟。如果大于0,则会向上舍入。

答案 3 :(得分:0)

你也可以使用这个:

DECLARE @number_hours FLOAT = 2.98
DECLARE @HOUR NUMERIC
DECLARE @MIN NUMERIC
DECLARE @FORIF FLOAT = @number_hours


SET @number_hours = CASE WHEN @number_hours<0 THEN @number_hours*-1 ELSE @number_hours END
SET @HOUR = ROUND(@number_hours,1)
SET @MIN = (1-(@HOUR-@number_hours))*60


IF(@FORIF) < 0
BEGIN
    PRINT '-'+CONVERT(varchar,@HOUR-1)+':'+CONVERT(VARCHAR,ROUND(@MIN,0))
END
ELSE
    PRINT '+'+ CONVERT(varchar,@HOUR-1)+':'+CONVERT(VARCHAR,ROUND(@MIN,0))