如何将数字(10,6)数据类型列值插入到数字(8,6)数据类型列中

时间:2017-06-07 07:30:45

标签: sql netezza

我有一个表TABLEA with COL1 NUMERIC(8,6),需要在第二个表TABLEB中插入一个包含值123.000000的值。我尝试过下面的场景。在这种情况下,我必须使用{ {1}}功能和NVL一起

CAST

也在下面尝试

SELECT CAST(899.000000 AS NUMERIC(8,6))-- This gives Numeric overflow.  Value does not fit in a numeric(8,6)

任何见解都会有所帮助。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

NUMERIC(p,s)  | Exact numerical, precision p, scale s

在您的查询中,精度值为8,这就是为什么越过流量误差。实际精度值为9.

SELECT CAST(899.000000 AS NUMERIC(8,6)

我已更新您的查询,如下所示。

SELECT CAST(899.000000 AS NUMERIC(9,6))

答案 1 :(得分:0)

您需要更改TABLEA.COL1

的数据类型

请注意以下事项:

SELECT CAST(899.00000 AS NUMERIC(8,6)) /*Overflow*/
SELECT CAST(899.00000 AS NUMERIC(8,5)) /*Works*/
SELECT CAST(899.00000 AS NUMERIC(9,6)) /*Works*/
SELECT CAST(99.123456 AS NUMERIC(8,6)) /*Works*/
SELECT CAST(100 AS NUMERIC(8,6)) /*Overflow*/
SELECT CAST(99.9999994 AS NUMERIC(8,6)) /*Works (rounds down to 99.999999)*/
SELECT CAST(99.9999995 AS NUMERIC(8,6)) /*Overflow (rounds up to 100)*/

基本上,"(8 - 6)== 2",所以numeric(8, 6)不能存储小数点左边超过2位的任何数字。即无法存储任何数字>= 100

来自w3schools.com

Data type     | Description
------------- | -----------
DECIMAL(p,s)  | Exact numerical, precision p, scale s.
                Example: decimal(5,2) is a number that has
                3 digits before the decimal and 2 digits after the decimal
NUMERIC(p,s)  | Exact numerical, precision p, scale s. (Same as DECIMAL)

答案 2 :(得分:0)

重要说明: netezza中的十进制/数字数据类型存储为封面下的浮点值。因此,如果您例如,您将不会“浪费”数据库中的任何空间。从数字(7,X)到数字(14,X)或从数字(4,X)到数字(6,X)

在此处查看有关这些超级低级数据类型的更多详细信息:https://www.tutorialspoint.com/cprogramming/c_data_types.htm 请注意,内部CPU正在处理二进制数据类型(基数为2),大多数人使用基数为10的数字来讨论这些事情。其他(更详细的)解释存在于网络上,但这与此无关:)