注册
达梦数据库to_char(CEIL(expression))结果显示为科学记数法
专栏/LeeWen的铺子/ 文章详情 /

达梦数据库to_char(CEIL(expression))结果显示为科学记数法

LeeWen 2021/09/24 1931 0 0
摘要 达梦数据库to_char(CEIL(expression))结果显示为科学记数法,可以通过修改CALC_AS_DECIMAL=2解决

现象描述

达梦数据库参数为默认参数。

CEIL(n):求大于或等于数值 n 的最小整数,n 必须是数值类型,返回类型与 n 的类型相同。

情况1:n为指定的一个数值

SQL> select ceil(11.1) from dual; 行号 CEIL(11.1) ---------- ---------- 1 12 已用时间: 7.058(毫秒). 执行号:204.

Oracle数据库中:

SQL> select ceil(11.1) from dual;

CEIL(11.1)
----------
	12

可以观察到,n为指定的一个数值的情况下,结果与Oracle中相同。

情况2:n为数值表达式

达梦数据库参数为默认参数。测试如下:

disql中执行结果如下:

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual; 行号 (SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60 ---------- -------------------------------------------------------------------- 1 2.896666666666667E+001 SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual; 行号 CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60) ---------- -------------------------------------------------------------------------- 1 3.100000000000000E+001 SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual; 行号 TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2610:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60)) ---------- ----------------------------------------------------------------------------------- 1 6.31E2

管理工具中执行结果如下:

image-20201026211249033

image-20201026211318675

image-20201026211345578

结果可能不一样因为SYSDATE是变化的,但是可以观察到to_char(ceil(表达式))的结果是已科学记数法表示的。并且CEIL对表达式求值时返回的结果并不是整数

Oracle中:

sqlplus中执行:

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual; (SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDHH24:MI:SS'))*24*60 -------------------------------------------------------------------- 36.4333333 SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual; CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDHH24:MI:SS'))*24*60) -------------------------------------------------------------------------- 37 SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual; TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2 ---------------------------------------- 637

可以观察到在Oracle中结果为整数,且to_char(ceil(表达式))结果也为整数。

原因

参考《达梦数据库整数除法等运算默认舍弃小数》,猜测可能和CALC_AS_DECIMAL参数的取值有关。该参数为静态参数,取值如下:

0:默认值,表示整数类型的除法、整数与字符或BINARY串的所有四则运算,结果都处理成整数;
1:表示整数类型的除法全部转换为DEC(0,0)处理;
2:表示将整数与字符或BINARY串的所有四则运算都转换为 DEC(0,0)处理
注:该参数只有在USE_PLN_POOL为0或1时有效。当USE_PLN_POOL为2或3时,按照CALC_AS_DECIMAL=2处理(USE_PLN_POOL默认为1)

进行验证测试:

1、设置CALC_AS_DECIMAL参数值为2,并重启数据库生效

SQL> sp_set_para_value(2,'CALC_AS_DECIMAL',2); --重启数据库; SQL> select para_name,para_value from v$dm_ini where para_name='CALC_AS_DECIMAL'; 行号 PARA_NAME PARA_VALUE ---------- --------------- ---------- 1 CALC_AS_DECIMAL 2

2、执行测试SQL

SQL> select (SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60 from dual; 行号 (SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60 ---------- -------------------------------------------------------------------- 1 65.0666666666664 已用时间: 1.199(毫秒). 执行号:5. SQL> select ceil((SYSDATE - to_date('2020-10-26 20:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60) from dual; 行号 CEIL((SYSDATE-TO_DATE('2020-10-2620:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60) ---------- -------------------------------------------------------------------------- 1 66 已用时间: 0.650(毫秒). 执行号:6. SQL> select to_char(ceil((SYSDATE - to_date('2020-10-26 10:39:05','YYYY-MM-DD hh24:mi:ss')) * 24 * 60)) from dual; 行号 TO_CHAR(CEIL((SYSDATE-TO_DATE('2020-10-2610:39:05','YYYY-MM-DDhh24:mi:ss'))*24*60)) ---------- ----------------------------------------------------------------------------------- 1 666 已用时间: 0.640(毫秒). 执行号:7.

可以观察到,将CALC_AS_DECIMAL参数设置为2生效后,结果与Oracle中执行相同。

解决

修改CALC_AS_DECIMAL参数值为2,并重启数据库生效并验证。

Step1:sp_set_para_value(2,‘CALC_AS_DECIMAL’,2);

Step2:重启数据库

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服