在SQL中将十进制转换为时间6.80 = 7.20小时

时间:2014-01-03 11:32:30

标签: sql-server tsql datetime time date-arithmetic

请帮我这样做

十进制6.80应该等于7.20小时

DECLARE @R1 decimal(4,2);
DECLARE @R2 decimal(4,2);

declare @Type1 decimal(4,2);
declare @Type2 decimal(4,2);

DECLARE @R1Time decimal(4,2);
DECLARE @R2Time decimal(4,2);

SET @R1=2.5
SET @R2=3.5


SET @Type1=17;
SET @Type2=7;

SET @R1Time=(FORMAT((ISNULL(60.0/NULLIF(@R1,0),0)),'N2'))
SET @R2Time=(FORMAT((ISNULL(60.0/NULLIF(@R2,0),0)),'N2'))

SELECT @R1Time as R1Min
SELECT @R2Time as R2Min

SELECT FORMAT(((@Type1*@R1Time)/60.0),'N2') R1Hrs -- 6.80 hours this = 24*17=408/60
SELECT FORMAT(((@Type2*@R2Time)/60.0),'N2') R2Hrs

SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60*(convert(decimal(4,2),FORMAT(((@Type1*@R1Time)/60.0),'N2'))), 0), 108);--6.48 hours

6.80小时这= 24 * 17 = 408/60这应该是7.20小时不是6.48是吗?我错了请帮助我谢谢

@ R1是一小时内60/2.5 = 24分钟每Type1和17 Type1是17 * 24 = 408分钟然后转换为时间 -

2 个答案:

答案 0 :(得分:3)

那么你所说的是十进制分隔符前的数字是正确的(以小时为单位),小数分隔符之后的数字是绝对分钟数?

然后在伪代码中你可以这样做:

INPUT = 6.80

HOURS = FLOOR(INPUT)
DECIMALS = (INPUT - HOURS) * 100

if ( DECIMALS > 60 )
{
     HOURS = HOURS + 1
     MINUTES = DECIMALS - 60
}

// Now hours and minutes are in the way you intended

现在你所要做的就是将这个伪代码转换为SQL代码。

在函数形式中,这看起来像这样(我写的是这个,所以要注意拼写错误/错误):

CREATE FUNCTION ChangeTime
-- Input current time decimal
   (@CurrentTime decimal(2,1) )
RETURNS decimal(2,1) -- New time
AS
BEGIN

   DECLARE @Hours int, @Minutes int;
   SET @Hours = FLOOR(@CurrentTime);
   SET @Minutes = (@CurrentTime - @Hours)*100;

   IF @Minutes >= 60 
   BEGIN
     SET  @Hours   =  @Hours   +  1; -- New hours
     SET  @Minutes =  @Minutes - 60; -- New minutes
   END

   RETURN ( @Hours + (@Minutes/100) ) -- New (corrected) time

END

另一方面,如果你的意思是:我需要转换小数,使得6.50变为6小时30分钟而6.80变为6小时48分,那么我们可以将功能更改为以下内容:

CREATE FUNCTION ChangeTime
-- Input current time decimal
   (@CurrentTime decimal(2,1) )
RETURNS decimal(2,1) -- New time
AS
BEGIN

   DECLARE @Hours int, @Minutes int;
   SET @Hours = FLOOR(@CurrentTime);
   SET @Minutes = (@CurrentTime - @Hours)*100;

   SET  @Minutes =  (@Minutes / 100) * 60; -- New minutes

   RETURN ( @Hours + (@Minutes/100) )       -- New (corrected) time

END

如果这两项功能都没有达到预期效果,请更新您的问题,并说明您想要达到的目标。

祝你好运!

答案 1 :(得分:0)

declare @hour decimal(6,2) = 6.8

select floor(@hour) + floor(@hour%1/.6) + @hour%1%.6

结果:

7.20

如果你想把它作为一个功能:

CREATE FUNCTION f_convert(@hour decimal(6,2))
RETURNS decimal(6,2)
AS
BEGIN
RETURN floor(@hour) + floor(@hour%1/.6) + @hour%1%.6
END

测试(sqlserver 2008 +):

SELECT dbo.f_convert(hour)
FROM (values (6.8),(3.9),(.59)) x(hour)

结果:

7.20
4.30
0.59