达梦数据库to_char(ceil(expression))结果显示为科学记数法处理办法

现象描述

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

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:重启数据库

总结

达梦数据库默认情况下,一些函数的运算处理与Oracle的处理稍有区别。

对于与Oracle存在区别的地方,在达梦数据库中大部分都可以直接通过调整参数解决与Oracle的兼容性,这对于程序来说可以省掉部分的代码调整工作。

更多资讯请上达梦技术社区了解:https://eco.dameng.com

达梦数据库是一款商业数据库管理系统,支持SQL语言,具有高性能、高可靠性、高安全性等特点。以下是在达梦数据库中进行数据查询和函数使用的一些常见操作: 1. 数据查询 使用SELECT语句来进行数据查询,例如: ``` SELECT * FROM table_name; ``` 其中,table_name是要查询的表名,*表示查询所有列。 也可以指定特定的列进行查询,例如: ``` SELECT column1, column2 FROM table_name; ``` 其中,column1和column2是要查询的列名。 2. 条件查询 可以使用WHERE子句来进行条件查询,例如: ``` SELECT * FROM table_name WHERE column1 = 'value'; ``` 其中,column1是要查询的列名,'value'是要查询的值。 还可以使用AND和OR逻辑运算符来组合多个条件,例如: ``` SELECT * FROM table_name WHERE column1 = 'value1' AND column2 = 'value2'; ``` 3. 函数使用 达梦数据库支持多种函数,例如: - 数学函数:ABS、CEIL、EXP、FLOOR、LOG、MOD、POWER、ROUND、SQRT等; - 字符串函数:CHAR、CONCAT、LENGTH、LOWER、UPPER、SUBSTR等; - 日期函数:CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、DATE、TIME、TIMESTAMP等; - 聚合函数:AVG、COUNT、MAX、MIN、SUM等。 可以在SELECT语句中使用函数,例如: ``` SELECT AVG(column1) FROM table_name; ``` 其中,AVG是平均值函数,column1是要计算平均值的列名。 以上是在达梦数据库中进行数据查询和函数使用的一些常见操作,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值