我有一个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中循环浏览?
答案 0 :(得分:1)
您可以通过一个小组来实现,例如
GROUP BY week(date)
答案 1 :(得分:1)
也这样做
SELECT SUM(qty) FROM products GROUP BY WEEK(date);
答案 2 :(得分:1)
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