达梦数据库to_char(ceil(expression))结果显示为科学记数法处理办法
现象描述达梦数据库参数为默认参数。CEIL(n):求大于或等于数值 n 的最小整数,n 必须是数值类型,返回类型与 n 的类型相同。情况1:n为指定的一个数值SQL> select ceil(11.1) from dual;行号CEIL(11.1)---------- ----------112已用时间: 7.058(毫秒). 执行号:204.Oracle数据库中:SQL> selec
现象描述
达梦数据库参数为默认参数。
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
管理工具中执行结果如下:
结果可能不一样因为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:重启数据库
总结
达梦数据库默认情况下,一些函数的运算处理与Oracle的处理稍有区别。
对于与Oracle存在区别的地方,在达梦数据库中大部分都可以直接通过调整参数解决与Oracle的兼容性,这对于程序来说可以省掉部分的代码调整工作。
更多资讯请上达梦技术社区了解:https://eco.dameng.com
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)