我有一个包含一些日期和一些值的表,我想按周求和。
我用这个查询来做到这一点
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])并且我不知道为什么开始日期不正确
您按 进行分组WEEK(date),以便每周获得一个结果行。表达方式
CONCAT(date, '-', date + INTERVAL 6 DAY)
Run Code Online (Sandbox Code Playgroud)
然而 不是一个聚合(如SUM等MAX)。因此,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)