本文内容来自YashanDB官网,原文内容请见 https://doc.yashandb.com/yashandb/23.3/zh/%E5%BC%80%E5%8F%91%...

YashanDB提供如下算术运算符:

运算符操作数含义NULL参与运算
+一元/二元一元表示正数,二元表示加法结果为NULL
-一元/二元一元表示负数,二元表示减法结果为NULL
*二元乘法结果为NULL
/二元普通除法结果为NULL
%二元整数除法,返回余数结果为NULL

除法


YashanDB中,可实现除法运算的方式有:

  • 算术运算符:/、%
  • 内置函数:MODDIV

%

取模运算,与MOD函数同义。

格式为:n2 % n1

含义为:将n2 整除n1后剩余的数值作为取模的结果,即余数,余数的正负符号与n2一致。

若n1为0,不报错,而是直接将n2的值作为余数结果返回。

/

普通除法运算。

/与DIV的关系:

  • 对于小数(FLOAT/DOUBLE/NUMBER),/与DIV算法一致。
  • 对于整数,/作普通除法运算,DIV作整除运算并返回商数。

一般情况下,在/或DIV运算里0不能作为除数,否则报错,但是在被除数是浮点数的情况下,不报错而是做如下特殊处理:

  • 如果被除数是Nan,计算结果为Nan
  • 如果被除数是正浮点数或Inf,计算结果为Inf
  • 如果被除数是负浮点数或-Inf,计算结果为-Inf

运算优先级


从高到低的运算优先级为:+(取正)、-(取负)>*、/、%>+、-。同一优先级运算符从左向右执行。

可以使用双括号()来调整想达到的运算优先级。

数据类型


如下数据类型可能会参与到算术运算中:

  • 数值型(除BIT外)
  • 字符型
  • 日期时间型

类型转换

在进行二元算术运算时,YashanDB将通过隐式数据转换,将参与运算的数据类型统一到某个数据类型,统一原则为:

  • 数值型加、减、乘法最小提升规则:按TINYINT->SMALLINT->INT->BIGINT->NUMBER->FLOAT->DOUBLE顺序向后统一。
  • 数值型除法最小提升规则:按TINYINT/SMALLINT/INT/BIGINT->NUMBER->FLOAT->DOUBLE顺序向后统一。
  • 字符型数据与数值型数据进行运算时,将会向数值型统一。
  • 数值型、字符型数据与日期时间型数据进行运算时,将会向日期时间型统一。
(1)整型数值之间统一规则

行列标题格为参与算术运算的数据类型;内容单元格为统一后的数据类型;–表示不支持两种数据类型参与算术运算。

数据类型运算符or函数TINYINTSMALLINTINTBIGINT*
TINYINT+、-、*SMALLINTINTBIGINTBIGINT/NUMBER
/NUMBERNUMBERNUMBERNUMBER
%、MOD、DIVSMALLINTINTBIGINTBIGINT/NUMBER
SMALLINT+、-、*INTINTBIGINTBIGINT/NUMBER
/NUMBERNUMBERNUMBERNUMBER
%、MOD、DIVINTINTBIGINTBIGINT/NUMBER
INT+、-、*BIGINTBIGINTBIGINTBIGINT/NUMBER
/NUMBERNUMBERNUMBERNUMBER
%、MOD、DIVBIGINTBIGINTBIGINTBIGINT/NUMBER
BIGINT*+、-、*BIGINT/NUMBERBIGINT/NUMBERBIGINT/NUMBERBIGINT/NUMBER
/NUMBERNUMBERNUMBERNUMBER
%、MOD、DIVBIGINT/NUMBERBIGINT/NUMBERBIGINT/NUMBERBIGINT/NUMBER

Note

BIGINT类型与所有整数类型参与+、-、*、%、MOD、DIV算术运算,或者对BIGINT类型作取负(-)运算时:

运算结果转换为BIGINT或NUMBER由系统内部决定,YashanDB默认统一转换为BIGINT,如因业务需要转换为NUMBER,请联系我们的技术支持处理。

(2)整型数值与其他数值之间统一规则

行列标题格为参与算术运算的数据类型;内容单元格为统一后的数据类型,其中(1)表示采用上面(1)整型数值之间统一规则;–表示不支持两种数据类型参与算术运算。

数据类型运算符or函数整型数值NUMBERFLOATDOUBLE
整型数值+、-、*(1)NUMEBRFLOATDOUBLE
/(1)NUMEBRFLOATDOUBLE
%、MOD、DIV(1)NUMEBRFLOATDOUBLE
NUMBER+、-、*NUMEBRNUMBERFLOATDOUBLE
/NUMEBRNUMEBRFLOATDOUBLE
%、MOD、DIVNUMEBRNUMEBRFLOATDOUBLE
FLOAT+、-、*FLOATFLOATFLOATDOUBLE
/FLOATFLOATFLOATDOUBLE
%、MOD、DIVFLOATFLOATFLOATDOUBLE
DOUBLE+、-、*DOUBLEDOUBLEDOUBLEDOUBLE
/DOUBLEDOUBLEDOUBLEDOUBLE
%、MOD、DIVDOUBLEDOUBLEDOUBLEDOUBLE
(3)数值型与字符型统一规则

行列标题格为参与算术运算的数据类型;内容单元格为统一后的数据类型,其中(2)表示采用上面(2)整型数值与其他数值之间统一规则;–表示不支持两种数据类型参与算术运算。

数据类型运算符or函数整型数值NUMBERFLOATDOUBLE字符型
整型数值+、-、*、/、%、MOD、DIV(2)(2)(2)(2)NUMEBR
NUMBER+、-、*、/、%、MOD、DIV(2)(2)(2)(2)NUMBER
FLOAT+、-、*、/、%、MOD、DIV(2)(2)(2)(2)FLOAT
DOUBLE+、-、*、/、%、MOD、DIV(2)(2)(2)(2)DOUBLE
字符型+、-、*、/、%、MOD、DIVNUMBERNUMEBRFLOATDOUBLENUMEBR
(4)数值型、字符型与日期时间型统一规则

行列标题格为参与算术运算的数据类型;内容单元格为统一后的数据类型,其中(3)表示采用上面(3)数值型与字符型统一规则;–表示不支持两种数据类型参与算术运算;YM表示INTERVAL YEAR TO MONTH,DS表示INTERVAL DAY TO SECOND,TS表示TIMESTAMP。

数据类型运算符数值型字符型TIMEDATETSYMDS
数值型+(3)(3)--DATEDATE----
-(3)(3)----------
*(3)(3)------YMDS
/(3)(3)----------
字符型+、-(3)(3)--DATEDATE----
*、/(3)(3)------YMDS
TIME+------TSTS--TIME
-----DS------TIME
DATE+DATEDATETS----DATEDATE
-DATEDATETSNUMBERDSDATEDATE
TS+DATEDATETS----TSTS
-DATEDATETSDSDSTSTS
YM+------DATETSYM--
-----------YM--
*YMYM--------
/YMYM--------
DS+----TIMEDATETS--DS
-------------DS
*DSDS----------
/DSDS----------

示例


SELECT '44'/2 char_cal,
TYPEOF('44'/2) type_trans
FROM dual;
   CHAR_CAL TYPE_TRANS

         22 number
   

SELECT 2*CAST(2 AS FLOAT) int_cal,
TYPEOF(2*CAST(2 AS FLOAT)) type_trans
FROM dual;
    INT_CAL TYPE_TRANS                                                     

   4.0E+000 float

Copied!

日期时间型算术运算

日期时间型数据可参与如下算术运算:

运算符操作数返回类型运算规则
+二元* 时间* 将两个间隔类型相加,返回更长的间隔类型。

* 将DATE、TIMESTAMP与TIME类型相加,返回在时间轴上更靠后的TIMESTAMP。
* 将TIME、DATE、TIMESTAMP与间隔类型相加,返回在时间轴上更靠后的TIME、DATE、TIMESTAMP。
* 将DATE、TIMESTAMP与数值相加,数值被解释为天数(小数部分表示不满一天的时间),返回在时间轴上更靠后的DATE。 |
| - | 二元 | * 时间间隔
* 时间 | * 将两个间隔类型相减,返回更短的间隔类型。
* 将DATE、TIMESTAMP与TIME相减,返回在时间轴上更靠前的TIMESTAMP。
* 将两个DATE相减,返回数值,表示相差的天数。
* 将DATE与TIMESTAMP相减,或TIMESTAMP与TIMESTAMP相减,返回DS\_INTERVAL。
* 将DATE或TIMESTAMP与数值相减,数值被解释为天数(小数部分表示不满一天的时间),返回在时间轴上更靠前的DATE。 |
| * | 二元 | * 时间间隔
* 时间 | * 将间隔类型与数值相乘,返回被扩大倍数的间隔。 |
| / | 二元 | * 时间间隔
* 时间 | * 将间隔类型除以数值,返回被缩小倍数的间隔。 |

如下是时间类型和时间间隔类型支持运算的详细情况,其中YM表示INTERVAL YEAR TO MONTH,DS表示INTERVAL DAY TO SECOND,TS表示TIMESTAMP:

数据类型NUMBERTIMEDSYMDATETS
TIMEN/A支持运算:-
返回类型:DS支持运算:+-
返回类型:TIMEN/A支持运算:+
返回类型:TS支持运算:+
返回类型:TS
DS支持运算:*/ 
返回类型:DS支持运算:+ 
返回类型:TIME支持运算:+-
返回类型:DSN/A支持运算:+
返回类型:DATE支持运算:+
返回类型:TS
YM支持运算:*/ 
返回类型:YMN/AN/A支持运算:+-
返回类型:YM支持运算:+
返回类型:DATE支持运算:+
返回类型:TS
DATE支持运算:+-
返回类型:DATE支持运算:+-
返回类型:TS支持运算:+-
返回类型:DATE支持运算:+-
返回类型:DATE支持运算:-
返回类型:NUMBER支持运算:-
返回类型:DS
TS支持运算:+-
返回类型:DATE支持运算:+-
返回类型:TS支持运算:+-
返回类型:TS支持运算:+-
返回类型:TS支持运算:-
返回类型:DS支持运算:-
返回类型:DS

示例

CREATE TABLE date_dd(a DATE, b DATE);
INSERT INTO date_dd VALUES('2008-12-31','2018-12-31');
COMMIT;
     

SELECT b-a FROM date_dd;
        B-A

       3652
     

SELECT b-1 FROM date_dd;
B-1                          

2018-12-30 00:00:00                 
     
SELECT SYSDATE+2 FROM DUAL;
SYSDATE+2                    

2021-06-10 11:07:47                  
    

CREATE TABLE date_dt(c1 DATE, c2 TIMESTAMP);
INSERT INTO date_dt VALUES ('2020-03-31', '2020-03-31 12:30:59.999999');
COMMIT;
     
SELECT c1-2.5, c2-2.5 FROM date_dt;
C1-2.5                           C2-2.5

2020-03-28 12:00:00              2020-03-29 00:30:59
     
SELECT c1+'2.5', c2+'2.5' FROM date_dt;
C1+'2.5'                         C2+'2.5'

2020-04-02 12:00:00              2020-04-03 00:30:59    
     
SELECT c1 FROM date_dt;
C1

2020-03-31 00:00:00             
   
 

CREATE TABLE date_t(c1 TIME);
INSERT INTO date_t VALUES ('23:59:59.999999');
COMMIT;
     
SELECT c1+INTERVAL '5' HOUR FROM date_t;
C1+INTERVAL'5'HOUR

04:59:59.999999

Copied!

输出的日期如果不合法,结果会报错。

示例


SELECT C1+INTERVAL '01-01' YEAR TO MONTH FROM date_dt;

YAS-00008 type convert error : not a valid month

YAS-05012 date not valid for month specified

Copied!


YashanDB
1 声望0 粉丝

崖山数据库系统YashanDB是深圳计算科学研究院自主设计研发的新型数据库管理系统,融入原创的有界计算、近似计算、并行可扩展和跨模融合计算理论,可满足金融、政企、能源等关键行业对高性能、高并发及高安全性的...