为什么我的小数值不会转换为6,4?

时间:2014-10-14 17:13:23

标签: sql tsql

我在查询结果的列中有一堆十进制值,这些值都是这种格式:

_._ _ _ _ _ _ 

(小数点前1位整数,小数点后6位整数)

列中的值可能为NULL。

以下是这些值的一些示例:

4.010000
3.800000
1.260000
0.650000
0.010000
0.000000
NULL

当我在查询中更改select语句以将此列中的值强制转换为十进制(6,4)时,我收到此错误:

Arithmetic overflow error converting numeric to data type numeric.

为什么我收到此错误?

谢谢。

4 个答案:

答案 0 :(得分:3)

问题中的发布值(包括NULL执行转换为DECIMAL(6, 4)。该错误来自> = 100的值。

例如,以下所有内容都成功:

SELECT CONVERT(DECIMAL(6, 4), 4.010000)
SELECT CONVERT(DECIMAL(6, 4), 3.800000)
SELECT CONVERT(DECIMAL(6, 4), 1.260000)
SELECT CONVERT(DECIMAL(6, 4), 0.650000)
SELECT CONVERT(DECIMAL(6, 4), 0.010000)
SELECT CONVERT(DECIMAL(6, 4), 0.000000)
SELECT CONVERT(DECIMAL(6, 4), NULL)

现在尝试:

SELECT CONVERT(DECIMAL(6, 4), 100)

你会得到:

Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting int to data type numeric.

DECIMAL(6, 4)表示:总共6个数字,其中4个位于小数点右侧 因此: XX.YYYY
最大值: 99.9999

所以要么尝试:

  • DECIMAL(7,4)获取小数点左边的另一个数字,同时仍然保持在其右边4位
  • DECIMAL(6,3)保持6位总数,但在小数点右侧丢失一个位置,以便在左侧获得额外的一位。

答案 1 :(得分:0)

您的值大于99.9999,总计6位数,包括小数位

从表中获取最大值并检查小数位总数,然后尝试将其转换为适合该最大值。

SELECT MAX(data) FROM Table1

答案 2 :(得分:0)

根据this

When SET NUMERIC_ROUNDABORT is ON, an error is generated after a loss of 
precision occurs in an expression. When OFF, losses of precision do not 
generate error messages and the result is rounded to the precision of the 
column or variable storing the result.

以下内容:

SET NUMERIC_ROUNDABORT ON
SELECT CONVERT(DECIMAL(6, 4), 4.010000)

生成您报告的错误。我只是说这是一个可能的原因 问题。

答案 3 :(得分:0)

根据评论,您的表中有886,您可以使用以下查询。

Select Convert(Decimal(20,4), YourColumn)
From   YourTable
Where   YourColumnIs NULL 
    OR (
            Convert(Decimal(20,4), YourColumn) < 10 
            And 
            Convert(Decimal(20,4), YourColumn) > -10
        )

如果列的数据类型已经是数字数据类型,则可以删除where子句中的convert函数。

另外,请注意我在where子句中使用“&lt; 10”,因为它似乎是您想要的,但您可以将其更改为“&lt; 100”并仍然只能获得可以转换为十进制的值(6,4)。