跳到主要内容

DATE_ADD

描述

DATE_ADD 函数用于向指定的日期或时间值添加指定的时间间隔,并返回计算后的结果。

  • 支持的输入日期类型包括 DATE、DATETIME(如 '2023-12-31'、'2023-12-31 23:59:59')。
  • 时间间隔由数值(expre)和单位(time_unit)共同指定,expr 为正数时表示“添加”,为负数时等效于“减去”对应间隔。

该函数与 mysql 中的 date_add 函数 行为大致一致,但不同的是,mysql 支持联合单位的增减,如:

SELECT DATE_ADD('2100-12-31 23:59:59',INTERVAL '1:1' MINUTE_SECOND);
-> '2101-01-01 00:01:00'

doris 不支持这种输入。

别名

  • date_add
  • days_add
  • adddate

语法

DATE_ADD(<date_or_time_expr>, <expr> <time_unit>)

参数

参数说明
<date_or_time_expr>待处理的日期/时间值。支持类型:为 datetime 或者 date 类型,最高有六位秒数的精度(如 2022-12-28 23:59:59.999999),具体 datetime 和 date 格式请查看 datetime 的转换date 的转换)
<expr>希望添加的时间间隔,为 INT 类型
<time_unit>枚举值:YEAR, QUARTER, MONTH, WEEK,DAY, HOUR, MINUTE, SECOND

返回值

返回与 <date_or_time_expr> 类型一致的结果:

  • 输入 DATE 类型时,返回 DATE(仅日期部分);
  • 输入 DATETIME 类型,返回 DATETIME(包含日期和时间);
  • 带有 scale 的输入(如 '2024-01-01 12:00:00.123')会保留 scale,最高六位小数精度。

特殊情况:

  • 任何参数为 NULL 时,返回 NULL;
  • 非法单位或非数值 expr 时,报错;
  • 计算后超出日期类型范围(如 '0000-00-00 23:59:59' 之前,'9999-12-31 23:59:59' 之后)时,返回错误。
  • 若是下月不足输入日期的天数,会自动设置为下月最后一天

举例

---添加天数
select date_add(cast('2010-11-30 23:59:59' as datetime), INTERVAL 2 DAY);
+-------------------------------------------------+
| date_add('2010-11-30 23:59:59', INTERVAL 2 DAY) |
+-------------------------------------------------+
| 2010-12-02 23:59:59 |
+-------------------------------------------------+

---添加季度
mysql> select DATE_ADD(cast('2023-01-01' as date), INTERVAL 1 QUARTER);
+--------------------------------------------+
| DATE_ADD('2023-01-01', INTERVAL 1 QUARTER) |
+--------------------------------------------+
| 2023-04-01 |
+--------------------------------------------+

---添加周数
mysql> select DATE_ADD('2023-01-01', INTERVAL 1 WEEK);
+-----------------------------------------+
| DATE_ADD('2023-01-01', INTERVAL 1 WEEK) |
+-----------------------------------------+
| 2023-01-08 |
+-----------------------------------------+

---添加月数,因为2023年2月只有28天,所以1月31加一个月返回2月28
mysql> select DATE_ADD('2023-01-31', INTERVAL 1 MONTH);
+------------------------------------------+
| DATE_ADD('2023-01-31', INTERVAL 1 MONTH) |
+------------------------------------------+
| 2023-02-28 |
+------------------------------------------+

---负数测试
mysql> select DATE_ADD('2019-01-01', INTERVAL -3 DAY);
+-----------------------------------------+
| DATE_ADD('2019-01-01', INTERVAL -3 DAY) |
+-----------------------------------------+
| 2018-12-29 |
+-----------------------------------------+

---跨年的小时增加
mysql> select DATE_ADD('2023-12-31 23:00:00', INTERVAL 2 HOUR);
+--------------------------------------------------+
| DATE_ADD('2023-12-31 23:00:00', INTERVAL 2 HOUR) |
+--------------------------------------------------+
| 2024-01-01 01:00:00 |
+--------------------------------------------------+

---非法单位
select DATE_ADD('2023-12-31 23:00:00', INTERVAL 2 sa);
ERROR 1105 (HY000): errCode = 2, detailMessage =
mismatched input 'sa' expecting {'.', '[', 'AND', 'BETWEEN', 'COLLATE', 'DAY', 'DIV', 'HOUR', 'IN', 'IS', 'LIKE', 'MATCH', 'MATCH_ALL', 'MATCH_ANY', 'MATCH_PHRASE', 'MATCH_PHRASE_EDGE', 'MATCH_PHRASE_PREFIX', 'MATCH_REGEXP', 'MINUTE', 'MONTH', 'NOT', 'OR', 'QUARTER', 'REGEXP', 'RLIKE', 'SECOND', 'WEEK', 'XOR', 'YEAR', EQ, '<=>', NEQ, '<', LTE, '>', GTE, '+', '-', '*', '/', '%', '&', '&&', '|', '||', '^'}(line 1, pos 50)

---参数为NULL,返回NULL
mysql> select DATE_ADD(NULL, INTERVAL 1 MONTH);
+----------------------------------+
| DATE_ADD(NULL, INTERVAL 1 MONTH) |
+----------------------------------+
| NULL |
+----------------------------------+

---计算出的结果不在日期范围[0000,9999],返回错误
mysql> select DATE_ADD('0001-01-28', INTERVAL -2 YEAR);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[E-218]Operation years_add of 0001-01-28, -2 out of range

mysql> select DATE_ADD('9999-01-28', INTERVAL 2 YEAR);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[E-218]Operation years_add of 9999-01-28, 2 out of range