首页 > 解决方案 > 如何解决 SQL Server 中的数据类型不兼容问题

问题描述

我一直在尝试建立以下逻辑

Declare @OT float 
Declare @Remark varchar(100)
set @OT = 9.52
set @Remark = '1-25 hours'
select case when @Remark='1-25 hours'  then  (FLOOR((@OT * 100)/100)*150 + (((@OT * 100) % 100.00) * (150/60))) --@OT*150
                   when @Remark='26-35 hours' then (25*150) + ((FLOOR((@OT-25.00) * 100)/100 )*200 + (((@OT-25.00) * 100)%100) * (200/60))  --((@OT-25.00)* 200)
                   when @Remark='36-45 hours' then (25*150) + (10*200) + ( FLOOR(((@OT-35.00)*100)/100)*250 + (((@OT-35.00) * 100)%100) * (250/60)) --((@OT-35.00) * 250)
                   when @Remark='46-55 hours' then (25*150) + (10*200) + (10* 250) + (FLOOR(((@OT-45.00) *100)/100)*350 + (((@OT-45.00) * 100)%100) * (350/60)) --((@OT-45.00) * 350)
                   when @Remark='56-65 hours' then (25*150) + (10*200) + (10* 250) + (10 * 350) + (FLOOR(((@OT-55.00)*100)/100)*550 + (((@OT-55.00) * 100)%100) * (550/60)) --((@OT-55.00) * 550)
                   when @Remark='aboce 65 hours' then (25*150) + (10*200) + (10* 250) + (10 * 350) + (10 * 550) + (FLOOR(((@OT-65.00)*100)/100)*650 + (((@OT-65.00) * 100)%100) * (650/60)) --((@OT-65.00)* 650)
             end

但我得到以下错误

消息 402,级别 16,状态 1,第 19 行 数据类型 float 和 numeric 在模运算符中不兼容。

标签: sqlsql-server

解决方案


只需INT在执行之前强制转换modulo

Declare @OT float 
Declare @Remark varchar(100)
set @OT = 9.52
set @Remark = '1-25 hours'

SELECT FLOOR((@OT * 100)/100)*150 + ((CAST(@OT * 100 AS INT) % 100.00) * (150/60))

这是完整的代码:

select case when @Remark='1-25 hours'  then  (FLOOR((@OT * 100)/100)*150 + ((CAST(@OT * 100 AS INT) % 100.00) * (150/60))) --@OT*150
                   when @Remark='26-35 hours' then (25*150) + ((FLOOR((@OT-25.00) * 100)/100 )*200 + (CAST((@OT-25.00) * 100 AS INT)%100) * (200/60))  --((@OT-25.00)* 200)
                   when @Remark='36-45 hours' then (25*150) + (10*200) + ( FLOOR(((@OT-35.00)*100)/100)*250 + (CAST((@OT-35.00) * 100 AS INT)%100) * (250/60)) --((@OT-35.00) * 250)
                   when @Remark='46-55 hours' then (25*150) + (10*200) + (10* 250) + (FLOOR(((@OT-45.00) *100)/100)*350 + (CAST((@OT-45.00) * 100 AS INT)%100) * (350/60)) --((@OT-45.00) * 350)
                   when @Remark='56-65 hours' then (25*150) + (10*200) + (10* 250) + (10 * 350) + (FLOOR(((@OT-55.00)*100)/100)*550 + (CAST((@OT-55.00) * 100 AS INT)%100) * (550/60)) --((@OT-55.00) * 550)
                   when @Remark='aboce 65 hours' then (25*150) + (10*200) + (10* 250) + (10 * 350) + (10 * 550) + (FLOOR(((@OT-65.00)*100)/100)*650 + (CAST((@OT-65.00) * 100 AS INT)%100) * (650/60)) --((@OT-65.00)* 650)
             end

问题是你不能执行modulo,因为:

被除数必须是整数和货币数据类型类别中任何一种数据类型或数字数据类型的有效表达式。

即使你乘以100,你也不会改变类型。


推荐阅读