返回首页

gbase数据、南大通用产品文档:GBase8aDATE_ADD(),DATE_SUB()

更新日期:2024年09月11日

函数说明
以下函数执行日期计算:

DATE_ADD(date,INTERVAL expr type),加法操作;

DATE_SUB(date,INTERVAL expr type),减法操作。

参数说明

date 是一个DATETIME 或DATE 值,指定一个日期的开始。expr 是一个表达
式,用来指定从起始日期添加或减去的时间间隔值;

INTERVAL 关键字和类型修饰符大小写不敏感;

expr 是一个字符串,对于负值的时间间隔,它可以以一个“-”开头。

type 为关键词,它指示了表达式被解释的方式。
表 5-133 相关的type 和expr 参数说明
type 值
期望的expr 格式
MICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 857
type 值
期望的expr 格式
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
说明

在expr 的格式中,GBase UP 允许任何字符作为定界符。表中所显示的是建议的定界
字符。如果date 参数是一个DATE 值,并且计算的间隔仅仅有YEAR、MONTH 和
DAY 部分(没有时间部分),那么返回值也是一个DATE 值。否则返回值是一个
DATETIME 值;

如果表达式另一边是DATE 或DATETIME 类型,那么INTERVAL expr type 允许出现
在“+”的任何一边。对于“-”来说,INTERVAL expr type 值只能出现在右边,因为
从一个时间间隔减去一个DATE 或DATETIME 值没有意义。
注意
不同引擎支持的参数情况不同, 例如,HIVE 引擎不支持该函数。

8a 支持type 具体信息请参见“5.4.6.5.12 DATE_ADD(),DATE_S
UB”。
示例
示例1
将“2010-08-30 23:59:59”加1 秒。
gbase> SELECT '2010-08-30 23:59:59' + INTERVAL 1 SECOND FROM t;
+--------------------------------------------+
| '2010-08-30 23:59:59' + INTERVAL 1 SECOND |
+--------------------------------------------+
| 2010-08-31 00:00:00 |
+--------------------------------------------+
1 row in set
示例2
使用DATE_ADD()函数,将“2010-08-30 23:59:59”加一秒,执行结果与示例1 相

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 858
同。
gbase> SELECT DATE_ADD('2010-08-30 23:59:59',INTERVAL 1 SECOND) FROM t;
+---------------------------------------------------+
| DATE_ADD('2010-08-30 23:59:59',INTERVAL 1 SECOND) |
+---------------------------------------------------+
| 2010-08-31 00:00:00 |
+---------------------------------------------------+
1 row in set
示例3
将“2010-12-31 23:59:59”加一天。
gbase> SELECT INTERVAL 1 DAY + '2010-12-31 23:59:59' FROM t;
+----------------------------------------+
| INTERVAL 1 DAY + '2010-12-31 23:59:59' |
+----------------------------------------+
| 2011-01-01 23:59:59 |
+----------------------------------------+
1 row in set
示例4
使用DATE_ADD()函数,将“2010-12-31 23:59:59”加一天,执行结果与示例3 相
同。
gbase> SELECT DATE_ADD('2010-12-31 23:59:59',INTERVAL 1 DAY) FROM t;
+------------------------------------------------+
| DATE_ADD('2010-12-31 23:59:59',INTERVAL 1 DAY) |
+------------------------------------------------+
| 2011-01-01 23:59:59 |
+------------------------------------------------+
1 row in set
示例5
DATE_ADD()函数,type 类型为“MINUTE_SECOND”。
gbase> SELECT DATE_ADD('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) FROM t;
+---------------------------------------------------------------+
| DATE_ADD('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND) |
+---------------------------------------------------------------+
| 2011-01-01 00:01:00 |
+---------------------------------------------------------------+
1 row in set

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 859
示例6
DATE_SUB()函数,type 类型为“DAY_SECOND”。
gbase> SELECT DATE_SUB('2010-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND) FROM t;
+----------------------------------------------------------------+
| DATE_SUB('2010-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND) |
+----------------------------------------------------------------+
| 2009-12-30 22:58:59 |
+----------------------------------------------------------------+
1 row in set
示例7
DATE_ADD()函数,type 类型为“DAY_HOUR”。
gbase> SELECT DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR) FROM t;
+------------------------------------------------------------+
| DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR) |
+------------------------------------------------------------+
| 2009-12-30 14:00:00 |
+------------------------------------------------------------+
1 row in set

示例8
DATE_ADD()函数,type 类型为“DAY_HOUR”。
gbase> SELECT DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 -10' DAY_HOUR) FROM t;
+-------------------------------------------------------------+
| DATE_ADD('2010-01-01 00:00:00', INTERVAL '-1 -10' DAY_HOUR) |
+-------------------------------------------------------------+
| 2009-12-30 14:00:00 |
+-------------------------------------------------------------+
1 row in set
说明
因为“-1”是减去一天,
所以小时“-10”,
也是进行减法,
这个操作,
取决于最前面的操作符号。

下面示例里的写法,等价于示例7 的计算。
示例9
DATE_SUB()函数,type 类型为“DAY”。
gbase> SELECT DATE_SUB('2010-01-02', INTERVAL 31 DAY) FROM t;

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 860
+-----------------------------------------+
| DATE_SUB('2010-01-02', INTERVAL 31 DAY) |
+-----------------------------------------+
| 2009-12-02 |
+-----------------------------------------+
1 row in set
示例10
DATE_ADD()函数,type 类型为“SECOND_MICROSECOND”。
gbase> SELECT DATE_ADD('2010-08-31 23:59:59.000002',INTERVAL '1.999999'
SECOND_MICROSECOND) AS DATE_ADD FROM t;
+----------------------------+
| DATE_ADD |
+----------------------------+
| 2010-09-01 00:00:01.000001 |
+----------------------------+
1 row in set
说明

如果用户指定了一个过短的间隔值(没有包括type 关键词所期望的所有间隔部分),
GBase UP 假设用户遗漏了间隔值的最左边部分;

例如,如果指定一个type 为DAY_SECOND,那么expr 的值预期应当具有天、小时、
分钟和秒部分。如果用户指定的值像“1:10”这样的格式,GBase UP 假设天和小时部
分被遗漏了,
指定的值代表分钟和秒。
也就是说,
“1:10”
DAY_SECOND 等价于
“1:10”
MINUTE_SECOND。这类似于GBase UP 解释TIME 值为经过的时间而不是一天的时
刻;

如果用户从一个日期类型中加或减一个包含时间的值,结果会自动调节然后转换成日
期类型。
示例11
在“2010-01-30”上加1 天。
gbase> SELECT DATE_ADD('2010-08-30', INTERVAL 1 DAY) FROM t;
+----------------------------------------+
| DATE_ADD('2010-08-30', INTERVAL 1 DAY) |
+----------------------------------------+
| 2010-08-31 |
+----------------------------------------+
1 row in set
示例12

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 861
在日期类型中加1 个小时,返回结果转换为“日期+时间”类型。
gbase> SELECT DATE_ADD('2010-01-01', INTERVAL 1 HOUR) FROM t;
+-----------------------------------------+
| DATE_ADD('2010-01-01', INTERVAL 1 HOUR) |
+-----------------------------------------+
| 2010-01-01 01:00:00 |
+-----------------------------------------+
1 row in set
说明

如果用户使用了不正确的日期,返回结果将是NULL。

如果用户增加MONTH、YEAR_MONTH 或YEAR,并且结果日期的天比新月份的最
大天数还大,那么它将被调整到新月份的最大天数。
示例13
在“2010-01-30”上加1 月。
gbase> SELECT DATE_ADD('2010-01-30', INTERVAL 1 MONTH) FROM t;
+------------------------------------------+
| DATE_ADD('2010-01-30', INTERVAL 1 MONTH) |
+------------------------------------------+
| 2010-02-28 |
+------------------------------------------+
1 row in set

取值:[0|1]
默认值:1
说明:hash distinct 优化。默认打开。
修改方式:
可使用set 语句修改值也可在配置文件中修改值。
适用于session、
global

GBase 8a MPP Cluster 参数手册
文档版本2022-06-07
南大通用数据技术股份有限公司
26
范围均可。

根据导出语法规定,
SELECT…INTO OUTFILE…导出路径需在SQL 语句中指定,
否则报错。导出路径必须为绝对路径,不支持相对路径。