我有一个 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 中循环会更好吗?
- 您可以使用Year() https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_year and Week() https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_weekMySQL 中的函数,获取给定日期的年份和周数。
Week()
函数将返回从 0 到 53 的周数。因此,您将需要使用Year()
如果您有跨越多年的数据,则可以同时使用。
- 但随后,你就会更感兴趣了解相关周的开始日期和结束日期。这是我们可以使用一个非常有趣的函数的地方DayOfWeek() https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_dayofweek。它返回给定日期的工作日索引(1 = 星期日,2 = 星期一,...,7 = 星期六)
- 我们可以用Date_Add() https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_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() https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)