DATE_ADD函数之KingbaseES与其他数据库比较
关键字
DATE_ADD函数、KingbaseES、MySQL、人大金仓、KingbaseES
问题描述
目前KingbaseES只支持与DATE_ADD函数功能相近的ADDDATE函数,为实现KingbaseES中兼容DATE_ADD函数,且实现函数的完整功能,本文对不同数据库中的DATE_ADD函数进行调研分析,进一步完善KES中DATE_ADD函数功能。
函数介绍
DATE_ADD函数是比较常用的日期时间函数,主体功能是用于对日期和时间进行加减操作。
函数原型:
DATE_ADD(TYPE_date, INTERVAL expr unit );
函数功能:
将一个日期或时间加上指定的时间间隔,返回一个新的日期或时间。
参数说明:
参数1: TYPE_date:要进行加减操作的日期或时间,可以是date、datetime、time、timestamp类型的参数。
参数2: interval关键字加后面的内容
1. expr:指定要日期或时间加上或者减去的数值,以字符串的形式输入,可能是一个带‘-’(负号)的值。
2. unit:日期加减数值的类型,unit支持的类型包括:
unit支持的类型 | 描述 |
YEAR | 描述若干年的间隔 INTERVAL '9' YEAR |
MONTH | 描述若干月的间隔 INTERVAL '9' MONTH |
DAY | 描述若干天的间隔 INTERVAL '9' DAY |
HOUR | 描述若干小时的间隔 INTERVAL '9' HOUR |
MINUTE | 描述若干分钟的间隔 INTERVAL '9' MINUTE |
SECOND | 描述若干分钟的间隔 INTERVAL '9' MINUTE |
YEAR TO MONTH/YEAR_MONTH | 描述若干年若干月间隔 INTERVAL '10-9' YEAR TO MONTH |
DAY TO HOUR/DAY_HOUR | 描述若干天若干小时间隔 INTERVAL '10 9' DAY TO HOUR |
DAY TO MINUTE/DAY_MINUTE | 描述若干天若干分钟间隔 INTERVAL '10 9:09' DAY TO MINUTE |
DAY TO SECOND/DAY_SECOND | 描述若干天若干秒间隔 INTERVAL '10 9:09:50' DAY TO SECOND |
HOUR TO MINUTE/HOUR_MINUTE | 描述若干小时若干分钟间隔 INTERVAL '10:09' HOUR TO MINUTE |
HOUR TO SECOND/HOUR_SECOND | 描述若干小时若干秒间隔 INTERVAL '10:09:10' HOUR TO SECOND |
MINUTE TO SECOND/MINUTE_SECOND | 描述若干分钟若干秒间隔 INTERVAL '09:10' MINUTE TO SECOND |
表 1
返回值:
返回一个新的日期或时间,返回值的类型与TYPE_date类型一致。
各常用数据库对比分析
分析对比总述
各类数据库对DATE_ADD函数的支持情况见下表。
数据库 | 是否支持date_add函数 | 函数原型 |
KES | 支持 | DATE_ADD(TYPE_date, INTERVAL expr unit ); DATE_ADD(TYPE_date, float4 ); |
MySQL | 支持 | DATE_ADD(date,INTERVAL expr unit); |
oracle | 不支持 | 不支持 |
dm8 | 支持 | DATE_ADD(date,INTERVAL expr unit); |
sqlserver | 不支持,相近函数为dateadd() | DATEADD(datepart,number,date) |
opengauss | 暂未调研 | 暂未调研 |
表 2
对比不同数据库中该函数的功能,列举下列差异点进行示例分析。
对比类型 | 对比点 | 示例分析章节 |
输入参数1 | 输入参数1时是否加类型名称 | 2.1.1 |
不加参数类型的输入,系统存储的时间类型 | 2.1.2 | |
输入time类型参数,不加类型名称 | 2.1.3 | |
参数1输入now() | 2.1.4 | |
参数1 输入NULL | 2.1.5 | |
参数1输入空串 | 2.1.6 | |
输入参数2 | 参数2是否支持float类型 | 2.2.1 |
interval后输入的数值是否可以省略单引号 | 2.2.2 | |
interval后的unit部分是否可以省略 | 2.2.3 | |
参数2 输入NULL | 2.2.4 | |
参数2输入空串 | 2.2.5 | |
特殊示例 | 对月末31日的日期类型,增加月份结果 | 2.3.1 |
表 3
示例分析
示例分析对比的数据库包括:KingbaseES、MySQL、dm8、oracle
2.1 输入参数1相关分析
2.1.1 输入参数1时是否加类型名称
KES使用手册中对于该函数的使用方法,示例显示输入参数1时需要在日期时间数据前加上日期时间类型名称,而mysql手册中使用该函数时,不需要在数据前加上类型名称。
实际示例结果可见表中,对于参数1的时间日期数据,若按时间日期标准格式输入,则可以不加上日期时间类型名称,不影响函数使用。
数据库 | 测试用例 | 结果 |
KES | select date_add(timestamp'2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00 |
select date_add('2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00 | |
MySQL | select date_add(timestamp'2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00 |
select date_add('2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00 | |
dm8 | select date_add(timestamp'2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00.000000 |
select date_add('2022-10-24 21:30:00', interval '5' hour); | 2022-10-25 02:30:00.000000 | |
oracle | 不支持 | 不支持 |
表 4
2.1.2 不加参数类型的输入,系统存储的时间类型
当只输入日期类型数据时,KES函数结果会补全时间部分数据。mysql中如果不对时间部分进行计算,则结果省略时间部分,若对时间部分有计算,则结果会显示时间。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24', interval '5' month); | 2023-03-24 00:00:00 |
select date_add(date'2022-10-24', interval '5' second); | 2022-10-24 00:00:05 | |
select date_add('2022-10-24', interval '5' month); | 2023-03-24 00:00:00 | |
MySQL | select date_add(date'2022-10-24', interval '5' month); | 2023-03-24 |
select date_add(date'2022-10-24', interval '5' second); | 2022-10-24 00:00:05.000000 | |
select date_add('2022-10-24', interval '5' month); | 2023-03-24 | |
dm8 | select date_add(date'2022-10-24', interval '5' month); | 2023-03-24 00:00:00.000000 |
select date_add('2022-10-24', interval '5' month); | 2023-03-24 00:00:00.000000 | |
oracle | 不支持 | 不支持 |
表 5
2.1.3 输入time类型参数,不加类型名称
只输入time类型参数时,需要添加输入time类型关键字,否则函数结果报错,mysql中直接返回NULL。
数据库 | 测试用例 | 结果 |
KES | select date_add(time'21:30:00', interval '5' second); | 2023-09-08 21:30:05 |
select date_add('21:30:00', interval '5' second); | ERROR: invalid input syntax for type timestamp with time zone: "21:30:00" | |
MySQL | select date_add(time'21:30:00', interval '5' second); | 21:30:05.000000 |
select date_add('21:30:00', interval '5' second); | NULL | |
dm8 | select date_add(time'21:30:00', interval '5' second); | Error in line: 1 Param incompatible. |
select date_add('21:30:00', interval '5' second); | 1900-01-01 21:30:05.000000 | |
oracle | 不支持 | 不支持 |
表 6
2.1.4 参数1输入now()
参数1输入now(),可实现对当前时间进行加减运算。
数据库 | 测试用例 | 结果 |
KES | select date_add(now(), interval '5' day); | 2023-09-13 14:15:38.582752 |
MySQL | select date_add(now(), interval '5' day); | 2023-09-13 06:11:27 |
dm8 | select date_add(now(), interval '5' day); | 2023-09-13 14:11:56.000000 |
oracle | 不支持 | 不支持 |
表 7
2.1.5 参数1 输入NULL
参数1输入为NULL,则函数结果返回NULL。
数据库 | 测试用例 | 结果 |
KES | select date_add(null, interval '5' day); | 返回空 |
MySQL | select date_add(null, interval '5' day); | NULL |
dm8 | select date_add(null, interval '5' day); | NULL |
oracle | 不支持 | 不支持 |
表 8
2.1.6 参数1输入空串
参数1输入空串,KES中DATE_ADD函数结果显示ERROR,mysql中函数返回NULL。
数据库 | 测试用例 | 结果 |
KES | select date_add('', interval '5' day); | ERROR : invalid input syntax for type timestamp with time zone: "" |
MySQL | select date_add('', interval '5' day); | NULL |
dm8 | select date_add('', interval '5' day); | NULL |
oracle | 不支持 | 不支持 |
表 9
2.2 输入参数2相关分析
2.2.1 参数2是否支持float类型
KES中DATE_ADD支持两种形式的参数输入,参数2可以输入带interval关键字的表达式,也可以输入类型为float4的数值。其他数据库不支持。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24', 520); | 2024-03-27 |
select date_add(timestamp'2022-10-24 21:30:00', 520); | 2024-03-27 21:30:00 | |
MySQL | select date_add(date'2022-10-24', 520); | ERROR |
select date_add(timestamp'2022-10-24 21:30:00', 520); | ERROR | |
dm8 | select date_add(date'2022-10-24', 520); | Error in line: 1 Param incompatible. |
select date_add(timestamp'2022-10-24 21:30:00', 520); | Error in line: 1 Param incompatible. | |
oracle | 不支持 | 不支持 |
表 10
2.2.2 interval后输入的数值是否可以省略单引号
KES中,输入参数时,interval后面的数值需要按字符串输入,不可直接输入数值,否则函数结果会报错。mysql中可以直接输入数值。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24', interval 5 day); | ERROR |
select date_add('2022-10-24', interval 5 day); | ERROR | |
MySQL | select date_add(date'2022-10-24', interval 5 day); | 2022-10-29 |
select date_add('2022-10-24', interval 5 day); | 2022-10-29 | |
dm8 | select date_add(date'2022-10-24', interval 5 day); | ERROR |
select date_add('2022-10-24', interval 5 day); | ERROR | |
oracle | 不支持 | 不支持 |
表 11
2.2.3 interval后的unit部分是否可以省略
KES中,DATE_ADD函数interval后面数值字符串后的unit部分(及时间日期类型)可以省略,省略时,默认interval后面的数值字符表示要增加的秒数。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24', interval '5'); | 2022-10-24 00:00:05 |
select date_add('2022-10-24', interval '5'); | 2022-10-24 00:00:05 | |
MySQL | select date_add(date'2022-10-24', interval '5'); | ERROR |
select date_add('2022-10-24', interval '5'); | ERROR | |
dm8 | select date_add(date'2022-10-24', interval '5'); | ERROR |
select date_add('2022-10-24', interval '5'); | ERROR | |
oracle | 不支持 | 不支持 |
表 12
2.2.4 参数2 输入NULL
参数2输入为NULL,KES的DATE_ADD函数返回NULL,mysql的DATE_ADD函数会报错。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24', NULL); | NULL |
MySQL | select date_add(date'2022-10-24', NULL); | ERROR |
dm8 | select date_add(date'2022-10-24', NULL); | NULL |
oracle | 不支持 | 不支持 |
表 13
2.2.5参数2输入空串
参数2输入空串时,函数无法正常工作。
数据库 | 测试用例 | 结果 |
KES | select date_add(date'2022-10-24',''); | ERROR |
MySQL | select date_add(date'2022-10-24',''); | ERROR |
dm8 | select date_add(date'2022-10-24',''); | NULL |
oracle | 不支持 | 不支持 |
表 14
2.3 特殊示例分析
2.3.1 对月末31日的日期类型,增加月份结果
使用DATE_ADD函数对月份最后一日进行加月份的操作,当遇到31日时,KES会将日期正确显示到下一月的1日;mysql显示的结果比实际日期结果少一日。
数据库 | 测试用例 | 结果 |
KES | SELECT DATE_ADD('2024-03-30',INTERVAL '1' MONTH) AS d1,DATE_ADD('2024-03-31',INTERVAL '1' MONTH) AS d2; | d1:2024-04-30 00:00:00 d2:2024-05-01 00:00:00 |
MySQL | SELECT DATE_ADD('2024-03-30',INTERVAL '1' MONTH) AS d1,DATE_ADD('2024-03-31',INTERVAL '1' MONTH) AS d2; | d1:2024-04-30 d2:2024-04-30 |
dm8 | SELECT DATE_ADD('2024-03-30',INTERVAL '1' MONTH) AS d1,DATE_ADD('2024-03-31',INTERVAL '1' MONTH) AS d2; | d1:2024-04-30 00:00:00.000000 d2:2024-04-30 00:00:00.000000 |
oracle | 不支持 | 不支持 |
表 15
结论
通过上述章节的对比分析,可总结出在以上所提各种差异点中,KES的DATE_ADD函数功能如下:
- 参数1相关:
- KES使用手册中对于该函数的使用方法,示例显示输入参数1时需要在日期时间数据前加上日期时间类型名称;
- 当只输入日期类型数据时,KES函数结果会补全时间部分数据;
- 只输入time类型参数时,需要添加输入time类型关键字,否则函数结果报错;
- 参数1输入now(),可实现对当前时间进行加减运算;
- 参数1输入为NULL,则函数结果返回NULL。
- 参数2相关:
- KES中DATE_ADD支持两种形式的参数输入,参数2可以输入带interval关键字的表达式,也可以输入类型为float4的数值。其他数据库不支持;
- KES中,输入参数2时,interval后面的数值需要按字符串输入,不可直接输入数值,否则函数结果会报错;
- KES中,DATE_ADD函数interval后面数值字符串后的unit部分(及时间日期类型)可以省略,省略时,默认interval后面的数值字符表示为要增加的秒数。其他数据库不可省略。
- 参数2输入为NULL,KES的DATE_ADD函数返回NULL,mysql的DATE_ADD函数会报错。
- 参数2输入空串时,函数无法正常工作。
- 特殊示例
- 使用DATE_ADD函数对月份最后一日进行加月份的操作,当遇到31日时,KES会将日期正确显示到下一月的1日,mysql显示的结果比实际日期结果少一日。




