日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 星期_MYSQL经典SQL之星期问题

發布時間:2024/9/19 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 星期_MYSQL经典SQL之星期问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

幾個星期相關的函數

WEEKDAY()

取值為0~6,對應星期一到星期日,每周以星期一為第一天

DAYOFWEEK()

取值為1~7,對應星期日到星期六,每周以星期日為第一天

DAYNAME()

取值為Sunday~Saturday,對應星期日到星期六,第一天是星期日;

該函數與參數lc_time_names有關,如果設置此參數值為"zh_CN",則得到對應的中文名稱“星期日”~“星期六”

示例:

mysql> set @day='2017-01-02';

Query OK, 0 rows affected (0.00 sec)

mysql> select weekday(@day),dayofweek(@day),dayname(@day);

+---------------+-----------------+---------------+

| weekday(@day) | dayofweek(@day) | dayname(@day) |

+---------------+-----------------+---------------+

| 0 | 2 | Monday |

+---------------+-----------------+---------------+

2017-01-02是星期一,使用這三個函數分別得到的是0,2,Monday

修改lc_time_names參數后,得到中文名稱:

mysql> set lc_time_names='zh_CN';

Query OK, 0 rows affected (0.00 sec)

mysql> select weekday(@day),dayofweek(@day),dayname(@day);

+---------------+-----------------+---------------+

| weekday(@day) | dayofweek(@day) | dayname(@day) |

+---------------+-----------------+---------------+

| 0 | 2 | 星期一 |

+---------------+-----------------+---------------+

WEEK()

Mode

First day of week

Range

Week 1 is the first week …

0

Sunday

0-53

with a Sunday in this year

1

Monday

0-53

with 4 or more days this year

2

Sunday

1-53

with a Sunday in this year

3

Monday

1-53

with 4 or more days this year

4

Sunday

0-53

with 4 or more days this year

5

Monday

0-53

with a Monday in this year

6

Sunday

1-53

with 4 or more days this year

7

Monday

1-53

with a Monday in this year

該函數用于獲取日期是年度中的第幾周。該函數比較復雜,使用不同的mode,得到不同的結果。見下表:

Mode

First day of week

Range

Week 1 is the first week …

0

Sunday

0-53

with a Sunday in this year

1

Monday

0-53

with 4 or more days this year

2

Sunday

1-53

with a Sunday in this year

3

Monday

1-53

with 4 or more days this year

4

Sunday

0-53

with 4 or more days this year

5

Monday

0-53

with a Monday in this year

6

Sunday

1-53

with 4 or more days this year

7

Monday

1-53

with a Monday in this year

例如,mode值為1,則每周的第一天為周一,week()函數的結果為0~53,如果第一個周天數少于4,則記為第0周,如果第一個周天數大于等于4,則記為第1周。

再如,mode值為2,則每周第一天為周日,week()函數的結果為1~53,如果第一個周里包含了周日,則記為第1周,如果第一個周里沒有周日,則記為上一年度的最后一周。

實際上,這個參數主要是為了解決跨年的周該如何歸屬的問題,是算作本年度的第一周,還是上一年度的最后一周,又或者是算作第0周。這需要根據使用場景和習慣來選擇。

但不管怎么歸屬,week函數本身的取值范圍有限,所以再跨年的時間區間一般不用此函數(后邊舉例說明)。

按周分組問題

假設我們有一張銷售表,內容如下:

mysql> select * from sales;

+----+---------------------+------+

| id | date | cost |

+----+---------------------+------+

| 1 | 2010-12-31 00:00:00 | 100 |

| 2 | 2011-01-01 00:00:00 | 200 |

| 3 | 2011-01-02 00:00:00 | 100 |

| 4 | 2011-01-06 00:00:00 | 100 |

| 5 | 2011-01-10 00:00:00 | 100 |

+----+---------------------+------+

現在,我們要統計每周的銷售額。

首先想到的是用week函數,計算日期對應的周數,然后按照這個周數來進行分組求和:

mysql> select week(date), sum(cost) from sales group by week(date);

+------------+-----------+

| week(date) | sum(cost) |

+------------+-----------+

| 0 | 200 |

| 1 | 200 |

| 2 | 100 |

| 52 | 100 |

+------------+-----------+

如果能保證這個日期區間是在一個年度內的,那么用week函數完全沒有問題。

很不幸的是,通常日期區間是跨年的,例如我們這個示例中的數據,恰好有跨年的周,2010-12-31日是第52周,2011-01-01變成了2011年度的第0周,而實際上這兩天是在同一周。

要解決這個問題,我們不能指望week函數,因為該函數的返回結果總是在0~53循環,我們需要找一個固定時間為第一周,之后的周數累加而非循環。

例如,我們選擇2010-01-03為第一周的第一天,之后的任意一天201x-xx-xx距離2010-01-03的天數/7記為周數,得到結果如下:

mysql> select floor(datediff(date, '2010-01-03')/7) as weekcount,sum(cost) from sales group by floor(datediff(date, '2010-01-03')/7);

+-----------+-----------+

| weekcount | sum(cost) |

+-----------+-----------+

| 51 | 300 |

| 52 | 200 |

| 53 | 100 |

+-----------+-----------+

以上解決方案中,我們選擇2010-01-03為起始日期,因為它離我們要統計的時間足夠遠,同時它是星期日(我們認為周日是一周的第一天)。

如果我們需要把星期一當作第一天,只需要改為2010-01-04即可。

總結

以上是生活随笔為你收集整理的mysql 星期_MYSQL经典SQL之星期问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。