我有一个带有a1和a2浮点列的表,
a2中的值由a1计算,a2 = 3 * a1
条件是:
如果a1中的值是9.5,我需要获得a2中的上限值 即,如果小数点后的数值大于或等于5,我需要得到上限值,否则我需要得到最低值。
我写了下面的查询
SET a2 =(case when substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(a1*3)),1) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table
但显然会返回以下错误:
转换varchar值时转换失败'。'数据类型int。
既然如此,就无法将varchar带入天花板或地板。
有什么办法可以实现这个目标吗?
非常感谢您的帮助。
a2的值基于a1不断变化,如果a1是4.5 a2应该是上限,如果a1是4.9 a2应该再次上限值但是如果a1是任何低于4.5的4.3,4.2,4.1那么它应该是底价值
除天花板和地板外,任何其他方法也可以。
答案 0 :(得分:2)
如何使用gradle
?它直接在数据库中实现这个逻辑:
round()
另一种方法是减去0.5:
set a2 = round(a1, 0);
如果你想set a2 = floor(a1 + 0.5)
作为一个字符串值(你说你想要一个浮点但代码返回一个字符串),那么使用a2
:
str()
默认情况下 set a2 = str(a1)
轮次。
答案 1 :(得分:0)
那是因为您尝试比较varchar> = 5,将其强制转换为INT:
SET a2 =(case when cast(substring(cast((a1 * 3) as varchar(6)),CHARINDEX('.',(cast((a1 * 3) as varchar(6))),1) as INT) >=5 then CEILING(a1 * 3) else FLOOR(a1 * 3) end) from table