Tsql 浮点数的错误结果
我有这张有1张唱片的桌子。我试图计算一个叫做Puntaje的东西,为了得到Puntaje的结果,我必须遵循以下公式:Tsql 浮点数的错误结果,tsql,sql-server-2012,Tsql,Sql Server 2012,我有这张有1张唱片的桌子。我试图计算一个叫做Puntaje的东西,为了得到Puntaje的结果,我必须遵循以下公式: Puntaje = (Infracciones * 10) / Horas Horas = Segundos / 60 / 60 我写了下面的脚本,但我有一些疑问和问题。 1) 是否有其他方法将值分配给@variables或计算总和? 2) 为什么Puntaje结果为0.00,必须为:0.854 Im使用MS SQL Server 2012 有人能帮我解决这个问题吗?先
Puntaje = (Infracciones * 10) / Horas
Horas = Segundos / 60 / 60
我写了下面的脚本,但我有一些疑问和问题。
1) 是否有其他方法将值分配给@variables或计算总和?
2) 为什么Puntaje结果为0.00,必须为:0.854
Im使用MS SQL Server 2012
有人能帮我解决这个问题吗?先谢谢你
/* content of table: @Customer_Drivers
DriverId Segundos KM QtyExcesos QtyFreAce QtyDesc Puntaje IDC
6172 717243 1782 17 0 0 0 0
*/
DECLARE @Customer_Drivers TABLE (
DriverId INT,
Segundos INT,
KM INT,
QtyExcesos INT,
QtyFreAce INT,
QtyDesc INT,
Puntaje INT,
IDC INT
);
SET NOCOUNT ON;
INSERT INTO @Customer_Drivers (DriverId, Segundos, KM, QtyExcesos, QtyFreAce, QtyDesc, Puntaje, IDC)
VALUES (6172, 717243, 1782, 17, 0, 0, 0, 0);
SET NOCOUNT OFF;
DECLARE @DriverId INT = 6172;
DECLARE @Horas INT;
DECLARE @QtyExcesos INT ;
DECLARE @QtyFreAce INT ;
DECLARE @QtyDesc INT ;
DECLARE @Infracciones INT;
DECLARE @Puntaje Decimal(18,2);
SET @Horas = (SELECT Segundos FROM @Customer_Drivers WHERE DriverId = @DriverId) / 60 / 60;
SET @QtyExcesos = (SELECT QtyExcesos FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @QtyFreAce = (SELECT QtyFreAce FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @QtyDesc = (SELECT QtyDesc FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @Infracciones = (@QtyExcesos + @QtyFreAce + @QtyDesc);
SET @Puntaje = ( @Infracciones * 10) /@Horas;
PRINT @Horas
PRINT @QtyExcesos
PRINT @QtyFreAce
PRINT @QtyDesc
PRINT @Puntaje
/* OUTPUT
199 -- @Horas
17 -- @QtyExcesos
0 -- @FreAce
0 -- @QtyDesc
0.00 -- @Puntaje must be = 0.854
*/
从我所学到的@变量应该是一些参数光输入参数和输出参数。。。。尝试执行您的存储过程,看看您在SQLServerManagementStudio中得到了什么
应该有一个返回值。根据我所学的内容@变量应该是一些参数光输入参数和输出参数。。。。尝试执行您的存储过程,看看您在SQLServerManagementStudio中得到了什么
应该有一个返回值。即使
@Puntaje
声明为十进制(18,2)
,但这并不意味着您的计算将被视为十进制。问题是(@Infracciones*10)/@Horas
正在使用所有整数,因此此表达式将生成整数值0
。然后将该整数0
转换为十进制并存储在@Puntaje
中
要解决此问题,需要先将表达式的一部分转换为十进制,以便结果为十进制:
SET @Puntaje = ( CAST(@Infracciones AS Decimal(18,2)) * 10) / @Horas
尽管
@Puntaje
声明为十进制(18,2)
,但这并不意味着您的计算将被视为十进制。问题是(@Infracciones*10)/@Horas
正在使用所有整数,因此此表达式将生成整数值0
。然后将该整数0
转换为十进制并存储在@Puntaje
中
要解决此问题,需要先将表达式的一部分转换为十进制,以便结果为十进制:
SET @Puntaje = ( CAST(@Infracciones AS Decimal(18,2)) * 10) / @Horas
您在计算中使用整数,因此结果将四舍五入(或截断)为最接近的整数。使用十进制值,或使用“强制转换”:
@Puntaje = (cast(@Infracciones as decimal(18,2)) * 10.0) / cast(@Horas as decimal(18,2))
检查我的语法-只需在不尝试的情况下键入此选项您在计算中使用的是整数,因此结果将四舍五入(或截断)为最接近的整数。使用十进制值,或使用“强制转换”:
@Puntaje = (cast(@Infracciones as decimal(18,2)) * 10.0) / cast(@Horas as decimal(18,2))
检查我的语法-只需在没有尝试的情况下键入它即可1)您可以使用选择@Horas=Segundos/3600、@qtyexceos=qtyexceos。。。来自[RS_Reports].[dbo].[Customer_Drivers],其中DriverId=@DriverId
。只要有一行结果,这应该是可行的
2) 其他人已经回答了,您必须除以小数才能得到小数,也就是说,您必须将@Horas转换为小数1)您可以使用选择@Horas=segudos/3600,@qtyexceos=qtyexceos。。。来自[RS_Reports].[dbo].[Customer_Drivers],其中DriverId=@DriverId
。只要有一行结果,这应该是可行的
2) 其他人已经回答了,你必须除以小数才能得到小数,也就是说,你必须将@Horas转换为小数非常感谢你,Ray,这对我帮助很大。非常感谢你,Ray,这对我帮助很大。非常感谢你,Tomas,这也对我帮助很大。我不知道怎样才能使两者都合格。非常感谢你,托马斯,这对我也有很大帮助。我不知道如何使两者都合格。谢谢你的回答,康纳。谢谢你的回答,康纳。谢谢你的回答,大卫。谢谢你的回答,大卫。