跳到主要内容

WEEKS_SUB

描述

WEEKS_SUB 函数用于在指定的日期或时间值上减少(或增加)指定数量的周数,返回调整后的日期或时间(本质是减去 weeks_value × 7 天)。支持处理 DATE、DATETIME 类型。

该函数与 weeks_sub 函数 和 mysql 中的 weeks_sub 函数 使用 WEEK 为单位的行为一致。

语法

WEEKS_SUB(`<date_or_time_expr>`, `<week_period>`)

参数

参数描述
<date_or_time_expr>输入的日期时间值,支持输入 date/datetime 类型,具体 datetime 和 date 格式请查看 datetime 的转换date 的转换
week_periodINT 类型整数,表示要减少的周数(正数表示减少,负数表示增加)。

返回值

返回减少了指定周数的日期或时间:

  • 若输入为 DATE 类型,返回值仍为 DATE 类型(仅调整年月日)。
  • 若输入为 DATETIME 类型,返回值仍为 DATETIME 类型(年月日调整后,时分秒保持不变)。
  • <weeks_value> 为负数时表示增加周数(等价于 WEEKS_ADD(<datetime_or_date_value>, <weeks_value>)。
  • 任意输入参数为 NULL,返回 NULL。
  • 若计算结果超出日期类型的有效范围(0000-01-01 00:00:00 至 9999-12-31 23:59:59),返回错误。

举例

-- DATETIME类型减少1周(基础功能,时分秒保持不变)
SELECT WEEKS_SUB('2023-10-01 08:30:45', 1) AS sub_1_week_datetime;
+---------------------+
| sub_1_week_datetime |
+---------------------+
| 2023-09-24 08:30:45 |
+---------------------+

-- DATETIME类型增加1周(负数weeks_value,跨月)
SELECT WEEKS_SUB('2023-09-24 14:20:10', -1) AS add_1_week_datetime;
+---------------------+
| add_1_week_datetime |
+---------------------+
| 2023-10-01 14:20:10 |
+---------------------+

-- DATE类型减少2周(仅调整日期,无时间部分)
SELECT WEEKS_SUB('2023-06-03', 2) AS sub_2_week_date;
+-----------------+
| sub_2_week_date |
+-----------------+
| 2023-05-20 |
+-----------------+

-- 跨年度减少(1月初减少1周,到上一年12月底)
SELECT WEEKS_SUB('2024-01-01', 1) AS cross_year_sub;
+----------------+
| cross_year_sub |
+----------------+
| 2023-12-25 |
+----------------+

-- 输入为NULL(返回NULL)
SELECT WEEKS_SUB(NULL, 5) AS null_input;
+------------+
| null_input |
+------------+
| NULL |
+------------+

-- 计算结果超出日期时间范围(下限)
SELECT WEEKS_SUB('0000-01-01', 1);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[E-218]Operation weeks_add of 0000-01-01, -1 out of range

-- 计算结果超出日期时间范围(上限)
SELECT WEEKS_SUB('9999-12-31', -1);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[E-218]Operation weeks_add of 9999-12-31, 1 out of range