在SQL中,WEEK() 函数用于从日期中提取周数,但其具体行为取决于 mode 参数。以下是详细说明(以 MySQL 为例):
1. WEEK() 函数的基本用法
语法:
WEEK(date, [mode])
-
date:日期或日期时间表达式(如
'2023-10-01')。 -
mode(可选):指定周的计算规则(默认值由系统变量
default_week_format决定,通常为0)。
2. mode 参数的作用
mode 定义了:
-
一周从哪一天开始(周日或周一)。
-
如何计算一年中的第一周(是否必须包含 >=4 天或仅需包含 1 月 1 日)。
3. mode 的取值与规则
MySQL 支持 mode 值为 0-7,具体规则如下:
| Mode | 一周首日 | 第一周规则 | 周数范围 |
|---|---|---|---|
| 0 | 周日 | 包含 1 月 1 日的周 | 0-53 |
| 1 | 周一 | 包含 >=4 天在本年的周 | 0-53 |
| 2 | 周日 | 包含 >=4 天在本年的周 | 1-53 |
| 3 | 周一 | 包含 >=4 天在本年的周 | 1-53 |
| 4 | 周日 | 包含 >=4 天在本年的周 | 0-53 |
| 5 | 周一 | 包含 1 月 1 日的周 | 0-53 |
| 6 | 周日 | 包含 >=4 天在本年的周 | 1-53 |
| 7 | 周一 | 包含 1 月 1 日的周 | 1-53 |
ISO 8601 标准:对应
mode=3(周一为周首,第一周需有 >=4 天在本年)。
4. 示例
假设日期为 '2023-01-01'(星期日):
SELECT
WEEK('2023-01-01', 0) AS mode0, -- 返回 0(周首为周日,1月1日是周日,视为第0周)
WEEK('2023-01-01', 3) AS mode3; -- 返回 1(周首为周一,第一周需有4天,2023年第一周从1月2日开始)
5. 注意事项
-
默认模式:若不指定
mode,使用系统变量default_week_format(通常为0)。 -
跨年周处理:年末的周可能属于下一年,建议结合
YEAR()或使用YEARWEEK(date, mode)获取年和周组合(如202301)。 -
一致性:在报表或分组统计时,确保所有查询使用相同
mode。
6. 使用建议
-
国际业务推荐
mode=3(符合 ISO 8601)。 -
明确指定
mode避免歧义,例如:
SELECT YEAR(date), WEEK(date, 3) FROM table;
或
SELECT YEARWEEK(date, 3) FROM table; -- 返回格式如 202301
通过合理设置 mode,可确保周数计算符合业务需求。
1305





