mysql中,一周默认是从周日~周一的,这和国外的习惯一样,而中国是周一~周日算一周。所以在统计诸如“本周的数据”时,就需要特殊注意。
看到很多网上的文章,在处理这个点上写很多代码,其实mysql提供的WEEK和YEARWEEK函数中已经考虑到了这一点。
WEEK函数介绍
通常,一年的正常年份为365天,闰年为366天。一年又可以分为许多周,每周有7天。 所以一年,我们经常有365/7 = 52周,周范围是从1到52。
要查看给定日期属于哪个周数,您可以使用WEEK函数,如下所示:
WEEK(date, mode);
WEEK函数接受两个参数:
- date是要获取周数的日期。
- mode是一个可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,返回的周数应在0到52之间或0到53之间。
如果忽略mode参数,默认情况下WEEK函数将使用default_week_format系统变量的值。
要获取default_week_format变量的当前值,请使用SHOW VARIABLES语句如下:
- mysql> SHOW VARIABLES LIKE 'default_week_format';
- +---------------------+-------+
- | Variable_name | Value |
- +---------------------+-------+
- | default_week_format | 0 |
- +---------------------+-------+
- 1 row in set
在我们的服务器中,default_week_format的默认值为0,下表格说明了mode参数如何影响WEEK函数:
模式 | 一周的第一天 | 范围 |
0 | 星期日 | 0-53 |
1 | 星期一 | 0-53 |
2 | 星期日 | 1-53 |
3 | 星期一 | 1-53 |
4 | 星期日 | 0-53 |
5 | 星期一 | 0-53 |
6 | 星期日 | 1-53 |
7 | 星期一 | 1-53 |
上表中“今年有4天以上”表示:
- 如果星期包含1月1日,并且在新的一年中有4天或更多天,那么这周是今年的第1周。
- 否则,这一周的数字是前一年的最后一周,下周才是今年的第1周。
所以在需要考虑年份的时候,使用YEARWEEK函数更加恰当。
示例
我们按照中国的习惯,把周一算成一周的第一天,分别通过WEEK函数和YEARWEEK函数来获取2019-07-11所在的周
select WEEK('2019-07-11',1);
返回值是28
select YEARWEEK('2019-07-11',1);
返回值是201928