DATE_ADD
📄字数 1.5K
👁️阅读量 加载中...
功能描述
在日期或时间值上增加时间间隔(如天数、小时、分钟等)。DATE_ADD()
函数等同于 ADDDATE()。
语法格式
sql
DATE_ADD(expr1, INTERVAL expr2 unit)
输入参数
expr1
:日期或时间值,DATE
、TIME
、DATETIME
、TIME WITH TIME ZONE
或DATETIME WITH TIME ZONE
类型,或能隐式转换为上述类型的其他类型。expr2
:增加的时间间隔值,INTERVAL unit
是时间间隔类型中的关键字,其中unit
表示时间间隔的单位,INTERVAL unit
参数的信息,包括unit
单位的完整列表,请参考 时间间隔类型。值可以为负数,表示减去的时间间隔。
提示
- 因
NULL
无具体的类型,所以当任意参数为NULL
时,可能会产生异常E10100 候选函数出现多义性
,需要手动为参数指定具体的形参类型,如:DATE_ADD(NULL::DATE, NULL::INTERVAL DAY)
。 expr1
为动态参数(如预编译语句参数)或字符串类型(VARCHAR)时,服务端自动匹配参数类型,可使用 CAST() 将expr1
转换为期望的类型,如:DATE_ADD(CAST('2025-10-10' AS DATE), INTERVAL 1 DAY)
。- 向
DATE
或DATETIME
值添加MONTH
间隔时,如果运算后的结果超过了该月天数所表示的最大范围,则该日期会被调整为该月的最后一天;否则,返回值的天数与expr1
的天数相同。例如:DATE_ADD('2024-03-31'::DATE, INTERVAL 1 MONTH)
,结果被调整为:2024-04-30
。
输出结果
输出结果类型由输入参数类型决定,任意输入参数为 NULL
时,输出结果为 NULL
。
输出结果和输入参数的对应关系如下:
第一个参数的类型 | 第二个参数的类型(unit关键字) | 输出结果 |
---|---|---|
DATE | DAY | DATE |
DATE | MONTH | DATE |
DATE | YEAR | DATE |
DATE | [注1] | DATETIME |
TIME/TIME WITH TIME ZONE | SECOND | TIME/TIME WITH TIME ZONE |
TIME/TIME WITH TIME ZONE | MINUTE | TIME/TIME WITH TIME ZONE |
TIME/TIME WITH TIME ZONE | HOUR | TIME/TIME WITH TIME ZONE |
TIME/TIME WITH TIME ZONE | DAY | TIME/TIME WITH TIME ZONE |
DATETIME/DATETIME WITH TIME ZONE | [注2] | DATETIME/DATETIME WITH TIME ZONE |
提示
[注1]
表示包含DAY
、MONTH
和YEAR
关键字外的其他INTERVAL
类型。[注2]
表示任意INTERVAL
类型。
示例
sql
-- 在'2020-12-31 23:59:59'时间上增加 1 秒
SQL> SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL '1' SECOND);
+--------------------------+
| EXPR1 |
+--------------------------+
| 2021-01-01 00:00:00.000 |
+--------------------------+
-- 在'2018-05-01'时间上增加 1 年
SQL> SELECT DATE_ADD('2018-05-01', INTERVAL '1' YEAR);
+--------------------------+
| EXPR1 |
+--------------------------+
| 2019-05-01 00:00:00.000 |
+--------------------------+
-- 在'2018-05-01'时间上增加 30 天 10 小时 20 分钟
SQL> SELECT DATE_ADD('2018-05-01', INTERVAL '30 10:20' DAY TO MINUTE);
+--------------------------+
| EXPR1 |
+--------------------------+
| 2018-05-31 10:20:00.000 |
+--------------------------+
-- 当向DATE或DATETIME值添加MONTH间隔时,若结果日期包含给定月份中不存在的日期,则该日期会被调整为该月的最后一天
SQL> SELECT DATE_ADD('2024-03-30', INTERVAL 1 MONTH) AS d1, DATE_ADD('2024-03-31', INTERVAL 1 MONTH) AS d2;
+--------------------------+--------------------------+
| D1 | D2 |
+--------------------------+--------------------------+
| 2024-04-30 00:00:00.000 | 2024-04-30 00:00:00.000 |
+--------------------------+--------------------------+