【问题标题】:search the column with decimal value for '.'在具有十进制值的列中搜索“。”
【发布时间】:2015-06-12 12:16:22
【问题描述】:

我有一个带有 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,则应为底价

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

【问题讨论】:

  • 在您的天花板和地板内放置一个转换器
  • 请编辑问题并提供示例数据和所需结果。可能有更好的方法来做你想做的事。
  • 正如@GordonLinoff 回答的那样,您描述的是 ROUND 函数的作用。

标签: sql sql-server decimal floor ceil


【解决方案1】:

使用round()怎么样?它直接在数据库中实现这个逻辑:

set a2 = round(a1, 0);

另一种方法是减去 0.5:

set a2 = floor(a1 + 0.5)

如果你想将a2 作为一个字符串值(你说你想要一个浮点数但代码返回一个字符串),那么使用str()

set a2 = str(a1)

str() 默认循环。

【讨论】:

  • 如果我使用圆形 (4.5,1) 它给我 4.5,但对于圆形 (4.9) 我需要 5 而不是 4.9
  • 使用圆形(4.5)。它应该四舍五入你的数字。
  • a2 的值根据 a1 不断变化,如果 a1 为 4.5,则 a2 应为该上限,如果 a1 为 4.9,a2 应再次为上限,但如果 a1 低于 4.5,则为 4.3,4.2, 4.1 那么它应该是一个底值
  • 抱歉,正确的语法是ROUND(number, precision)。四舍五入到 int 使用 ROUND(4.5, 0).
  • 我认为您的替代方法应该是set a2 = floor(a1 + 0.5),例如4.2 给出floor(4.7) = 4,4.6 给出floor(5.1) = 5。要么,要么使用ceiling 而不是floor。无论如何,我认为round(a2, 0) 可能是最有效的。此外,如果 a1 始终是四舍五入的值,为什么它是 float 而不是 int?如果是int,你可以直接set a1 = a2 + 0.5,隐式类型转换和整数截断会给你想要的。
【解决方案2】:

那是因为您试图比较 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

【讨论】:

  • 立即尝试。更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多