Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


SUBDATE

📄字数 1.8K
👁️阅读量 加载中...

功能描述

在日期或时间值上减去时间间隔(如天数、小时、分钟等)。

语法格式

sql
SUBDATE(expr1, INTERVAL expr2 unit)
SUBDATE(expr1, expr3)

输入参数

  • expr1:日期或时间值,DATETIMEDATETIMETIME WITH TIME ZONEDATETIME WITH TIME ZONE 类型,或能隐式转换为上述类型的其他类型。
  • expr2:减去的时间间隔值,INTERVAL unit 是时间间隔类型中的关键字,其中 unit 表示时间间隔的单位,INTERVAL unit 参数的信息,包括 unit 单位的完整列表,请参考 时间间隔类型。值可以为负数,表示增加的时间间隔。当以 INTERVAL 形式传入第二个参数时,SUBDATE() 函数和 DATE_SUB() 函数相等。
  • expr3:减少的天数,INTEGER 类型,或能隐式转换为 INTEGER 类型的其他类型。值可以为负数,表示增加的天数。

提示

  • NULL 无具体的类型,所以当任意参数为 NULL 时,可能会产生异常 E10100 候选函数出现多义性,需要手动为参数指定具体的形参类型,如:SUBDATE(NULL::DATE, NULL::INTERVAL DAY)
  • expr1 为动态参数(如预编译语句参数)或字符串类型(VARCHAR)时,服务端自动匹配参数类型,可使用 CAST()expr1 转换为期望的类型,如:SUBDATE(CAST('2025-10-10' AS DATE), INTERVAL 1 MONTH)
  • DATEDATETIME 值减去 MONTH 间隔时,如果运算后的结果超过了该月天数所表示的最大范围,则该日期会被调整为该月的最后一天;否则,返回值的天数与 expr1 的天数相同。例如:SUBDATE('2024-03-31'::DATE, INTERVAL 1 MONTH),结果被调整为:2024-02-29
  • SELECT SUBDATE(expr1, expr3) 的结果等价于 SELECT SUBDATE(expr1, INTERVAL expr3 DAY)

输出结果

输出结果类型由输入参数类型决定,任意输入参数为 NULL 时,输出结果为 NULL

输出结果和输入参数的对应关系如下:

第一个参数的类型第二个参数的类型(unit关键字)输出结果
DATEDAYDATE
DATEMONTHDATE
DATEYEARDATE
DATE[注1]DATETIME
DATE/DATETIMEINTEGER[注2]DATE
TIME/TIME WITH TIME ZONESECONDTIME/TIME WITH TIME ZONE
TIME/TIME WITH TIME ZONEMINUTETIME/TIME WITH TIME ZONE
TIME/TIME WITH TIME ZONEHOURTIME/TIME WITH TIME ZONE
TIME/TIME WITH TIME ZONEDAYTIME/TIME WITH TIME ZONE
DATETIME/DATETIME WITH TIME ZONE[注3]DATETIME/DATETIME WITH TIME ZONE

提示

  • [注1] 表示包含 DAYMONTHYEAR 关键字外的其他 INTERVAL 类型。
  • [注2] 不是 INTERVAL unit 类型的关键字,表示 INTEGER 类型。例如:ADDDATE(expr1, 1) 的结果等价于 ADDDATE(expr1, INTERVAL 1 DAY)
  • [注3] 表示任意 INTERVAL 类型。

示例

sql
-- 返回在'2020-1-1 00:00:00'时间上减去 1 秒,以及在'2018-05-01'时间上减去 1 年后的时间戳
SQL> SELECT SUBDATE('2020-1-1 00:00:00', INTERVAL '1' SECOND), SUBDATE('2018-05-01', INTERVAL '1' YEAR);

+--------------------------+--------------------------+
|          EXPR1           |          EXPR2           |
+--------------------------+--------------------------+
| 2019-12-31 23:59:59.000  | 2017-05-01 00:00:00.000  |
+--------------------------+--------------------------+

-- 在'2018-05-01'时间上减去 30 天 10 小时 20 分钟
SQL> SELECT SUBDATE('2018-05-01', INTERVAL '30 10:20' DAY TO MINUTE);

+--------------------------+
|          EXPR1           |
+--------------------------+
| 2018-03-31 13:40:00.000  |
+--------------------------+

-- 当向DATE或DATETIME值减去MONTH间隔时,若结果日期包含给定月份中不存在的日期,则该日期会被调整为该月的最后一天
SQL> SELECT SUBDATE('2024-03-30', INTERVAL 1 MONTH) AS d1, SUBDATE('2024-03-31', INTERVAL 1 MONTH) AS d2;

+--------------------------+--------------------------+
|            D1            |            D2            |
+--------------------------+--------------------------+
| 2024-02-29 00:00:00.000  | 2024-02-29 00:00:00.000  |
+--------------------------+--------------------------+