跳到主要内容

NEXT_DAY

描述

NEXT_DAY 函数用于返回指定日期之后第一个匹配目标星期几的日期,例如 NEXT_DAY('2020-01-31', 'MONDAY') 表示 2020-01-31 之后的第一个周一。该函数支持处理 DATE、DATETIME 类型,忽略输入中的时间部分(仅基于日期部分计算)。

该函数与 Orcle 的 next_day 函数 行为一致

语法

NEXT_DAY(`<date_or_time_expr>`, `<day_of_week>`)

参数

参数描述
<date_or_time_expr>支持输入 date/datetime 类型,具体 datetime 和 date 格式请查看 datetime 的转换date 的转换
<day_of_week>用于标识星期几的字符串表达式,为字符串类型。

<day_of_week> 必须是以下值之一(不区分大小写):

  • 'SU', 'SUN', 'SUNDAY'
  • 'MO', 'MON', 'MONDAY'
  • 'TU', 'TUE', 'TUESDAY'
  • 'WE', 'WED', 'WEDNESDAY'
  • 'TH', 'THU', 'THURSDAY'
  • 'FR', 'FRI', 'FRIDAY'
  • 'SA', 'SAT', 'SATURDAY'

返回值

返回类型为 DATE,表示基准日期之后第一个匹配 <day_of_week> 的日期。

特殊情况:

  • 若基准日期本身就是目标星期几,返回下一个目标星期几(而非当前日期);
  • <date_or_time_expr> 为 NULL,返回 NULL;
  • <day_of_week> 为无效值(如 'ABC'),抛出异常;
  • 若输入为 9999-12-31(无论是否包含时间),返回自身(因该日期是最大有效日期,不存在后续日期);

示例

--- 基准日期后第一个星期一
SELECT NEXT_DAY('2020-01-31', 'MONDAY') AS result;
+------------+
| result |
+------------+
| 2020-02-03 |
+------------+

--- 包含时间部分(忽略时间,仅用日期计算)
SELECT NEXT_DAY('2020-01-31 02:02:02', 'MON') AS result;
+------------+
| result |
+------------+
| 2020-02-03 |
+------------+

--- 基准日期本身是目标星期几(返回下一个)
SELECT NEXT_DAY('2023-07-17', 'MON') AS result; -- 2023-07-17 是星期一
+------------+
| result |
+------------+
| 2023-07-24 |
+------------+

--- 目标星期几为简称(不区分大小写)
SELECT NEXT_DAY('2023-07-13', 'FR') AS result; -- 2023-07-13 是星期四
+------------+
| result |
+------------+
| 2023-07-14 |
+------------+


--- 输入为 NULL(返回 NULL)
SELECT NEXT_DAY(NULL, 'SUN') AS result;
+--------+
| result |
+--------+
| NULL |
+--------+

--- 无效的星期标识(抛出异常)
mysql> SELECT NEXT_DAY('2023-07-13', 'ABC') AS result;
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[INVALID_ARGUMENT]Function next_day failed to parse weekday: ABC

--- 最大日期(返回自身)
SELECT NEXT_DAY('9999-12-31 12:00:00', 'SUNDAY') AS result;
+------------+
| result |
+------------+
| 9999-12-31 |
+------------+