在 MySQL 中每周进行求和

use*_*642 2 mysql

我有一个包含一些日期和一些值的表,我想按周求和。

我用这个查询来做到这一点

SELECT SUM(nb_like) AS nb_like , CONCAT(date, '-', date + INTERVAL 6 DAY) AS week
FROM fb_stats
GROUP BY WEEK(date)
ORDER BY WEEK(date)
Run Code Online (Sandbox Code Playgroud)

问题是:总和不正确(如果我从 2016-01-16 到 2016-01-22 进行总和 [![在此处输入图像描述][1]][1])并且我不知道为什么开始日期不正确

Tho*_*ner 5

您按 进行分组WEEK(date),以便每周获得一个结果行。表达方式

CONCAT(date, '-', date + INTERVAL 6 DAY)
Run Code Online (Sandbox Code Playgroud)

然而 不是一个聚合(如SUMMAX)。因此,date该表达式中的 仅仅是在任意选取的一周记录中找到的日期之一。

相反,您想要的是一周的第一天。为此,请首先确保为该WEEK函数使用适当的模式(或者更确切地说,YEARWEEK为了不混合年份),以确保所选的每周中都存在这一天,例如:

YEARWEEK(date, 2)
Run Code Online (Sandbox Code Playgroud)

从周日开始,你可以得到几周的时间。模式 7 会让您从星期一开始一周。在这里阅读此内容:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

然后使用此方法获取一周中的星期日:

STR_TO_DATE('<yearweek> Sunday', '%X%V %W');
Run Code Online (Sandbox Code Playgroud)

将 <yearweek> 替换为实际的yearweek。(如果您决定使用模式 7,请将“星期日”替换为“星期一”。)

完整的查询:

SELECT 
  SUM(nb_like) AS nb_like, 
  CONCAT
  (
    STR_TO_DATE(CONCAT(YEARWEEK(date, 2), ' Sunday'), '%X%V %W'),
    '-',
    STR_TO_DATE(CONCAT(YEARWEEK(date, 2), ' Sunday'), '%X%V %W') + INTERVAL 6 DAY
  ) AS week
FROM fb_stats
GROUP BY YEARWEEK(date, 2)
ORDER BY YEARWEEK(date, 2);
Run Code Online (Sandbox Code Playgroud)