sum mysql查询中的多个日期范围

dsf9zpds  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(337)

我有一个mysql表'products',有三列:

Date | Product | Qty

我的目标是把每周每种产品的数量加起来。
得到两个给定日期之间的总和很容易:

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循环一下?

bis0qfac

bis0qfac1#

你可以用 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
hgtggwj0

hgtggwj02#

你可以通过一个小组来实现

GROUP BY week(date)
ac1kyiln

ac1kyiln3#

按这样做分组

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

相关问题