【问题标题】:Arithmetic overflow error converting numeric to data type numeric, but value is shorter than specified precision将数字转换为数据类型数字的算术溢出错误,但值小于指定精度
【发布时间】:2019-01-03 13:44:51
【问题描述】:

我有一列在表中定义如下

td_long_shr_qty (numeric(18,6), null)

当我更新列时出现错误

UPDATE
    fact
SET
    td_long_shr_qty = 1720187931245.8069
WHERE
    id = 29

将数字转换为数字数据类型时出现算术溢出错误。

这个号码1720187931245.8069 是否有任何问题,因为它小于 18 精度,为什么我会收到此错误。请帮助。

【问题讨论】:

  • 为什么你向我们展示了td_long_shr的列定义,但你的查询正在更新td_long_shr_qty?您是否查看了错误的列定义?
  • 抱歉我已经更新了列名
  • 1720187931245 超过 12 位。 numeric(18,6) 表示共18位,其中小数点前12位,小数点后6位。
  • numeric(18,6) 是“18 位,其中 6 位出现在小数点后”。你不能把你给我们看的号码放在这样的类型中。
  • 不,不是。您定义的精度为 18,比例为 6。您尝试输入的值的精度为 17,比例为 4。docs.microsoft.com/en-us/sql/t-sql/data-types/…

标签: sql sql-server tsql


【解决方案1】:

NUMERIC(18, 6) 的含义是总共 18 个精度位,其中 6 个位于小数点的右侧(如果存在)。所以,这意味着这个类型可以容纳的最大数是:

 999999999999.999999
1720187931245.8069

我特意从下面的查询中粘贴了您的号码,并与可能的最大值对齐。你应该很明显的看到它超过了NUMERIC(18, 6)的容量。

【讨论】:

  • 您可能希望包含来自 ducommentation 的相关引用:"s (scale) 将存储在小数点右侧的小数位数。从 p 中减去该数字以确定小数点左边的最大位数。”除此之外,+1。
  • @ZoharPeled 但这并不意味着 OP 的号码 实际上适合 NUMBER(18, 6),因为 RHS 上只有 4 个有效数字意味着会有LHS 上有 2 个额外的位置?
  • @TimBiegeleisen 不是我理解的方式。您的解释是正确的 - 小数分隔符左侧的最大位数是总位数(精度)减去小数分隔符右侧的最大位数(比例)。因此,如果数据类型是 `numeric(18,6),它最多可以存储小数点分隔符左侧的 12 位数字,就像您解释的那样。
  • @ZoharPeled 您在文档中哪里找到的???因为我在这里看不到:docs.microsoft.com/en-us/sql/t-sql/data-types/… 您评论中的句子比我找到的文档中的要清晰得多。
  • @EricBrandt 谢谢! MSDN 应该把这句话用明亮的粗体字母放在一个亮黄色的框中。
猜你喜欢
  • 2021-10-29
  • 2017-09-25
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多