我想将一个数字转换为小时..我的代码正在这样做,但并非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)
答案 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))