2014-12-02 15 views
0

我想將數字轉換爲小時數..我的代碼正在這樣做,但並非100%正確。 2.98是2小時,0.98 * 60 = 58,8分鐘..我想輪到這個分鐘到59 我希望我的結果在我的代碼+02:59中,沒有這個小輪就是+02:58。將數字轉換爲小時數(ROUND問題)

任何人都知道如何在我的代碼中舍入一段時間?

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) 
+1

可以小時超過23? 24小時將產生00:毫米與此方法 – 2014-12-02 13:47:45

+0

可能重複[輪SQL整數到最近的小時](http://stackoverflow.com/questions/17195603/round-sql-integer-to-arest-hour) – 2014-12-02 14:03:14

回答

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

這就是它, 謝謝! – Deiwys 2014-12-02 14:55:34

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

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,則輪到。

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-(@[email protected]_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))