请帮我这样做
十进制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分钟然后转换为时间 -
答案 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