【问题标题】:SUM multiple date ranges in mysql query在mysql查询中求和多个日期范围
【发布时间】:2018-10-12 08:26:25
【问题描述】:

我有一个包含三列的 MySql 表“产品”:

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 中循环会更好?

【问题讨论】:

  • 如果我没记错的话,有一个mysql函数week(),那么你可以结合group by使用它
  • 不需要用php脚本找一周。你可以在mysql中使用week函数和qty的总和。

标签: php mysql


【解决方案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 

【讨论】:

  • 很棒的答案 - 我不知道那些 Sql 函数!
  • 刚刚意识到,只有一个问题:您的命令仅返回表中有数据的周数。我正在尝试使用它来返回显示每周数量的数据,即使数量为零。例如:week1:0 week2:200 week3:0 等等..可能吗?
  • @charliechina 要获得所有星期,我们将不得不使用另一个包含所有星期日期的表格。这是可行的。过一段时间会给出更新的答案。
  • @charliechina 什么是开始的一周?如果没有定义最小周数,这个查询可能会变得很麻烦。
  • 开始日期为今天,结束日期为今天 +90。或者由 PHP 变量定义。我想到的一种方法是制作一个包含所有日期的临时表并进行 Join 但这感觉有点像黑客!
【解决方案2】:

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

GROUP BY week(date)

【讨论】:

    【解决方案3】:

    GROUP BY 这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2014-02-20
      相关资源
      最近更新 更多