在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
,可确保周数计算符合业务需求。