应用情景
在处理关于周数据的统计的时候,碰上一个问题:通过MySQL的week函数统计出来的“周数”,比PHP的date(“W”,time())获取的“周数”小1。如“2020-06-18 13:27:01”,MySQL取出来的是24,而PHP取出来的是25,这就导致有一周的数据没有匹配上。
头一次碰上这个问题,于是我特意用win10角落的日历数了一下,发现“2020-06-18 13:27:01”确实在2020年的第25周,那问题就出在MySQL的week函数了。
问题所在
仔细一查,发现MySQL的week函数居然还有第2个参数——mode?!
WEEK函数的两个参数:
date是要获取周数的日期。
mode是一个可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,返回的周数应在0到52之间或0到53之间。
看了这个注释我一开始没看懂,但看了下面这个表:
模式 | 一周的第一天 | 范围 |
0 | 星期日 | 0-53 |
1 | 星期一 | 0-53 |
2 | 星期日 | 1-53 |
3 | 星期一 | 1-53 |
4 | 星期日 | 0-53 |
5 | 星期一 | 0-53 |
6 | 星期日 | 1-53 |
7 | 星期一 | 1-53 |
忽然明白了!
默认情况下,mode参数取0,也就是说,周是从星期日开始算的,再看“2020-06-18 13:27:01”,其实,它所在的这一周是 “2020-06-14”到“2020-06-20”,而不是“2020-06-15”到“2020-06-21”
这就清楚了,是计算一周的第一天不同导致的,那么,只有将其统一,就OK了。
解决方案
在MySQL的week函数中加入第二个参数“1”,即 WEEK(created_at,1),再次查看,MySQL和PHP所取的周数就一致了!
至于为什么有0-7这八种模式,有懂的朋友,欢迎留言!谢谢~