对 mysql 查询中的多个日期范围求和



我有一个MySql表"产品",有三列:

Date | Product | Qty

我的目标是每周对每种产品的数量求和。

在两个给定日期之间获取 SUM 很容易:

SELECT SUM(qty) FROM products WHERE date >= '2010-01-01' AND date < '2011-01-1'

我可以使用以下内容在 Php 中生成周数列表:

$today = date('Y-m-d', strtotime('last week Monday'));
$future = date('Y-m-d', strtotime('+90 days'));
$period = new DatePeriod(
new DateTime($today),
new DateInterval('P7D'),
new DateTime($future)
);
foreach ($period as $key => $value) {
$dates .= $value->format('Y-m-d');
}

是否有一个 MySql 查询可以按日期分组和求和?还是我最好在 Php 中循环播放?

您可以使用
  • MySQL中的Year()Week()函数来获取给定日期的年份和周数。Week()函数将返回从 0 到 53 的周数。因此,如果您有跨越多年的数据,您将需要同时使用Year()函数。
  • 但是,您将更有兴趣了解相关周的开始日期和结束日期。在这里,我们可以使用一个非常有趣的函数DayOfWeek().它返回给定日期的工作日索引(1 = 星期日,2 = 星期一,..., 7 = 星期六(
  • 我们可以使用Date_Add()函数使用工作日索引值和实际日期值来确定给定日期的开始周日期和结束周日期。

请尝试以下操作(如果一周从星期日开始(:

SELECT 
DATE_ADD(`date`, INTERVAL(1 - DAYOFWEEK(`date`)) DAY) AS week_start_date, 
DATE_ADD(`date`, INTERVAL(7 - DAYOFWEEK(`date`)) DAY) AS week_end_date, 
SUM(qty) 
FROM 
products 
GROUP BY week_start_date, week_end_date 

如果一周从星期一开始,另一个方便的功能是WeekDay().它返回日期的工作日索引(0 =星期一,1 = 星期二,...6 = 星期日(。

请尝试以下操作(如果一周从星期一开始(:

SELECT 
DATE_ADD(`date`, INTERVAL(0 - WEEKDAY(`date`)) DAY) AS week_start_date, 
DATE_ADD(`date`, INTERVAL(6 - WEEKDAY(`date`)) DAY) AS week_end_date, 
SUM(qty) 
FROM 
products 
GROUP BY week_start_date, week_end_date 

你可以通过一个组来实现这一点

喜欢
GROUP BY week(date)

分组依据

SELECT SUM(qty) FROM products GROUP BY WEEK(date);

最新更新