在mysql查询中汇总多个日期范围

时间:2018-10-12 08:26:26

标签: php mysql

我有一个MySql表'Products',其中包含三列:

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查询,该查询可以对Group By和SUM by日期起作用?还是我最好在Php中循环浏览?

3 个答案:

答案 0 :(得分:1)

您可以通过一个小组来实现,例如

GROUP BY week(date)

答案 1 :(得分:1)

也这样做

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

答案 2 :(得分:1)

  • 您可以在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