我有一个带有 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 时转换失败。
既然它,不能把瓦尔查尔带到天花板或地板上。
有什么方法可以做到这一点吗?
您的帮助将不胜感激。
a2 的值根据 a1 不断变化,如果 a1 是 4.5 a2 应该是上限,如果 a1 是4.9,a2 应该再次是上限值,但如果 a1 低于 4.5 作为 4.3,4.2,4.1,那么它应该是下限值
除天花板和地板外,任何其他方法也可以。
使用round()
怎么样? 它直接在数据库中实现此逻辑:
set a2 = round(a1, 0);
另一种方法是减去 0.5:
set a2 = floor(a1 + 0.5)
如果您希望a2
作为字符串值(您说您想要一个浮点数,但代码返回一个字符串),请使用 str()
:
set a2 = str(a1)
默认情况下str()
舍入。
您尝试比较 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