oracle 在数据库中保存时,对较大的数字进行舍入

kfgdxczn  于 2023-04-11  发布在  Oracle
关注(0)|答案(2)|浏览(170)

在Oracle PLSQL developer中,我将transaction_id保存为436478757463572693,但它被保存为4.36478757463573E17。
当我搜索值时,我没有得到任何输出。

select * from JT_TASK_TRANSACTION_TAB t WHERE TRANSACTION_ID=436478757463572693

但是当我像下面这样搜索时,我得到了一个记录

select * from JT_TASK_TRANSACTION_TAB t WHERE TRANSACTION_ID=436478757463573000

我如何得到我的原始值436478757463572693而不是四舍五入的4.36478757463573E17?我需要像下面这样做吗?

select TO_NUMBER( TRANSACTION_ID, '999999999999999999')
       from TableA
       WHERE TRANSACTION_ID=4.36478757463573E17;

但我的输出仍然像下面。

我正在使用PLSQL开发者。请帮助
交易Id的数据类型

请求输出

gorkyyrv

gorkyyrv1#

该行为表明该列具有NUMBER(15,-3)数据类型:

CREATE TABLE JT_TASK_TRANSACTION_TAB (
  TRANSACTION_ID NUMBER(15, -3)
);

INSERT INTO JT_TASK_TRANSACTION_TAB ( transaction_id ) VALUES ( 436478757463572693 );

然后436478757463572693将以15位精度存储,并且刻度意味着它将四舍五入到最接近的1000。
输出:

SELECT table_name,
       column_name,
       data_type,
       data_precision,
       data_scale
FROM   all_tab_columns t
WHERE  column_name = 'TRANSACTION_ID'
AND    table_name  = 'JT_TASK_TRANSACTION_TAB'

是:
| 表名|列名称|数据类型|数据_精密度|DATA_SCALE|
| --------------|--------------|--------------|--------------|--------------|
| JT_TASK_TRANSACTION_TAB|交易ID|数量|十五岁|-3|
如果您这样做:

SELECT *
FROM   JT_TASK_TRANSACTION_TAB
WHERE  transaction_id = 436478757463572693;

则没有输出。
但是,将输入转换为相同的精度和比例:

SELECT *
FROM   JT_TASK_TRANSACTION_TAB
WHERE  transaction_id = CAST(436478757463572693 AS NUMBER(15,-3));

输出:
| 交易ID|
| --------------|
| 436478757463573000|
我如何得到我的原始值436478757463572693而不是四舍五入的4.36478757463573E17?我需要像下面这样做吗?

select TO_NUMBER( TRANSACTION_ID, '999999999999999999')
       from TableA
       WHERE TRANSACTION_ID=4.36478757463573E17;

4.36478757463573E17是科学记数法,与436478757463573000相同。
不要在已经是数字的东西上使用TO_NUMBERTO_NUMBER( string_value, format_model )接受一个字符串值作为第一个参数,因此您正在执行数字到字符串的隐式转换,然后显式地将字符串转换回数字,并有效地执行:

select TO_NUMBER(
         TO_CHAR(TRANSACTION_ID),
         '999999999999999999'
       )
from   TableA
WHERE  TRANSACTION_ID=4.36478757463573E17;

如果你想以特定的格式显示一个数字,那么使用TO_CHAR将其转换为格式化的字符串:

select TO_CHAR(
         TRANSACTION_ID,
         '999999999999999999'
       )
from   TableA
WHERE  TRANSACTION_ID=4.36478757463573E17;

如果您使用的是NUMBER(15,-3)数据类型,则不可能恢复原始数字,因为-3的小数位数告诉数据库您只想存储最接近1000的数字。数据库不会存储百位、十位和个位数,因此没有什么可以“恢复”的。
如果您不希望数据在表中舍入,请使用NUMBER(18,0)而不是NUMBER(15,-3)

CREATE TABLE JT_TASK_TRANSACTION_TAB (
  TRANSACTION_ID NUMBER(18,0)
);

INSERT INTO JT_TASK_TRANSACTION_TAB ( transaction_id )
VALUES ( 436478757463572693 );

然后:

SELECT *
FROM   JT_TASK_TRANSACTION_TAB
WHERE  transaction_id = 436478757463572693;

输出:
| 交易ID|
| --------------|
| 436478757463572693|

  • 注意:如果客户端应用程序使用科学计数法格式化数字,则使用TO_CHAR显式格式化它,或更改客户端应用程序上的设置。

fiddle

x4shl7ld

x4shl7ld2#

您可以执行以下操作之一。

create table t1 ( fld1 number)
insert into t1(fld1) values( 436478757463572693 )
select to_char(fld1) from t1

IN SQL plus you can do this
col fld1 format 99999999999999999999999999999999999999

--在Toad视图中=〉Toad选项...=〉数据网格=〉数据
您将在SQL开发人员中进行一些设置,以更改显示设置。

相关问题