使用十进制值搜索“。”列。

时间:2015-06-12 12:16:22

标签: sql sql-server decimal floor ceiling

我有一个带有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那么它应该是底价值

除天花板和地板外,任何其他方法也可以。

2 个答案:

答案 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