MariaDB周计算异常:2024-01-02为何匹配周0而非周1?
MariaDB周数计算不一致问题解析
问题根源
你遇到的问题是因为MariaDB中week()函数默认的周计算规则,和date_format的%u格式符规则不匹配:
week()函数默认使用模式0:一周从周日开始,每年第一周是包含当年第一个周日的那一周。2024年1月7日是当年第一个周日,所以1月1日-1月6日会被归为第0周(尽管year()返回2024)。date_format(p_date, '%u')遵循ISO周标准:一周从周一开始,每年第一周是包含当年至少4天的周。2024年1月2日属于当年第一周,所以返回1。
两者规则冲突,导致你用week(p_date)=1作为条件时查不到数据。
解决方案
统一周计算逻辑即可解决,以下是几种可行方案:
1. 让week()函数使用ISO周规则
调用week()时指定模式3(对应ISO标准),同时用yearweek()避免跨年周的年份误差:
SELECT amount, date_format(p_date, '%u') as week, date_format(p_date, '%Y') as year FROM test WHERE week(p_date, 3) = 1 AND yearweek(p_date, 3) DIV 100 = 2024;
2. 直接使用yearweek()匹配ISO周
yearweek(p_date, 3)返回YYYYWW格式的数值,直接用这个条件更精准:
SELECT amount, date_format(p_date, '%u') as week, date_format(p_date, '%Y') as year FROM test WHERE yearweek(p_date, 3) = 202401;
3. 调整date_format匹配默认week()规则
如果要保留默认的周日始周规则,把%u换成%v(对应周日始的周数):
SELECT amount, date_format(p_date, '%v') as week, date_format(p_date, '%Y') as year FROM test WHERE week(p_date) = 0 AND year(p_date) = 2024;
规则对比表
| 函数/格式符 | 周起始 | 第一周判定规则 | 2024-01-02返回周数 |
|---|---|---|---|
week(p_date)(默认模式0) | 周日 | 包含当年第一个周日的周 | 0 |
date_format(p_date, '%u') | 周一 | 包含当年至少4天的周 | 1 |
week(p_date, 3) | 周一 | 包含当年至少4天的周 | 1 |
date_format(p_date, '%v') | 周日 | 包含当年第一个周日的周 | 0 |
内容的提问来源于stack exchange,提问作者user3104427
相关产品推荐
相关产品推荐

