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