最后于 更新
WEEK
描述
WEEK 函数用于返回指定日期对应的星期数,默认 Mode 为 0,支持通过 mode 参数自定义星期计算规则(如星期的第一天是周日还是周一、星期数的范围、第一个星期的判定标准等)。 参数 mode 的作用参见下面的表格:
| Mode | 星期的第一天 | 星期数的范围 | 第一个星期的定义 |
|---|---|---|---|
| 0 | 星期日 | 0-53 | 这一年中的第一个星期日所在的星期 |
| 1 | 星期一 | 0-53 | 这一年的日期所占的天数大于等于 4 天的第一个星期 |
| 2 | 星期日 | 1-53 | 这一年中的第一个星期日所在的星期 |
| 3 | 星期一 | 1-53 | 这一年的日期所占的天数大于等于 4 天的第一个星期 |
| 4 | 星期日 | 0-53 | 这一年的日期所占的天数大于等于 4 天的第一个星期 |
| 5 | 星期一 | 0-53 | 这一年中的第一个星期一所在的星期 |
| 6 | 星期日 | 1-53 | 这一年的日期所占的天数大于等于 4 天的第一个星期 |
| 7 | 星期一 | 1-53 | 这一年中的第一个星期一所在的星期 |
该函数与 mysql 中的 week函数 行为一致。
语法
WEEK(`<date_or_time_expr>`)
WEEK(`<date_or_time_expr>`,`<mode>`)
参数
| 参数 | 描述 |
|---|---|
<datetime_or_date> | 输入的日期时间值,支持输入 date/datetime 类型,具体 datetime 和 date 格式请查看 datetime 的转换 和 date 的转换 |
<mode> | 可选,INT 类型,默认值为 0。计算规则由 mode & 7 决定,对应上表中的模式 0-7。 |
返回值
返回类型为 INT,表示指定日期对应的星期数,具体范围由 <mode> 决定(0-53 或 1-53)。
- 若
<mode>为非 0-7 的整数,则使用其低 3 位(mode & 7)对应的模式计算。例如,8 对应模式 0,9 对应模式 1,-1 对应模式 7; - 若任一参数为 NULL,返回 NULL;
- 跨年日期可能返回上一年的最后一周(如 2023 年 1 月 1 日在部分模式下属于 2022 年第 52 周)。
举例
越界 mode 使用其低 3 位。例如,8 对应模式 0:
SELECT WEEK('2021-01-01', 8) AS mode_8,
WEEK('2021-01-01', 0) AS mode_0,
WEEK('2021-01-01', 7) AS mode_7;
+--------+--------+--------+
| mode_8 | mode_0 | mode_7 |
+--------+--------+--------+
| 0 | 0 | 52 |
+--------+--------+--------+
-- 2020-01-01是星期三,当年第一个周日是2020-01-05,故属于第0周
SELECT WEEK('2020-01-01') AS week_result;
+-------------+
| week_result |
+-------------+
| 0 |
+-------------+
-- 2020-07-01是星期三,所在周包含≥4天属于2020年,为第27周
SELECT WEEK('2020-07-01', 1) AS week_result;
+-------------+
| week_result |
+-------------+
| 27 |
+-------------+
-- 对比mode=0和mode=3(不同规则的差异)
SELECT
WEEK('2023-01-01', 0) AS mode_0,
WEEK('2023-01-01', 3) AS mode_3;
+--------+--------+
| mode_0 | mode_3 |
+--------+--------+
| 1 | 52 |
+--------+--------+
-- 2023年第一个周一是1月2日,故2023-01-01属于2022年第52周
SELECT WEEK('2023-01-01', 7) AS week_result;
+-------------+
| week_result |
+-------------+
| 52 |
+-------------+
-- -1 & 7 = 7,因此使用模式 7
SELECT WEEK('2023-01-01', -1) AS week_result;
+-------------+
| week_result |
+-------------+
| 52 |
+-------------+
-- 输入为DATETIME类型(忽略时间部分)
SELECT WEEK('2023-12-31 23:59:59', 3) AS week_result;
+-------------+
| week_result |
+-------------+
| 52 |
+-------------+
---任意参数为 NULL ,结果返回 NULL
SELECT WEEK('2023-12-31 23:59:59', NULL),WEEK(NULL,3);
+-----------------------------------+--------------+
| WEEK('2023-12-31 23:59:59', NULL) | WEEK(NULL,3) |
+-----------------------------------+--------------+
| NULL | NULL |
+-----------------------------------+--------------+