sql - 如何解决 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 在模运算符中不兼容。
解决方案
只需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
,你也不会改变类型。
推荐阅读
- python - 如何使用 pygal 绘制熊猫分组值?
- c# - 如何使用计时器从 Mysql 数据库中检索数据?
- django - 同时编辑一个主题及其子条目
- clio-api - CLIO API - 内部服务器错误 - 创建通信
- typo3 - 在 TYPO3 模板中, v:variable.set 有效...但 f:variable 无效
- generics - 在 Rust 中,如何检查泛型参数是否属于特定类型并将其转换为
- elm - elm init, make, install and stuff inside reactor 因 HTTP 问题而失败
- ios - 如何使用 perform(aSelector: , with: , afterDelay: , inModes: ) 在延迟后暂停 CABasicAnimation
- python - 在 psycopg2 / postgres 命令中使用外部变量
- java - 是否可以在 Java 中替换依赖库的方法的实现?