Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择给定日期范围内的所有月份,包括值为0的月份_Mysql_Date_Group By_Between - Fatal编程技术网

Mysql 选择给定日期范围内的所有月份,包括值为0的月份

Mysql 选择给定日期范围内的所有月份,包括值为0的月份,mysql,date,group-by,between,Mysql,Date,Group By,Between,我正在尝试编写一个MySQL查询,以获得从给定日期到指定日期之间所有月份的每月平均值。我的想法是: 查询,类似于 SELECT AVG(value1) as avg_value_1, AVG(value2) as avg_value_2, MONTH(save_date) as month, YEAR(save_date) as year FROM myTable WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01' GROUP BY

我正在尝试编写一个MySQL查询,以获得从给定日期到指定日期之间所有月份的每月平均值。我的想法是:

查询,类似于

SELECT AVG(value1) as avg_value_1, 
AVG(value2) as avg_value_2, 
MONTH(save_date) as month, 
YEAR(save_date) as year
FROM myTable
WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01'
GROUP BY YEAR(save_date), MONTH(save_date)

avg_value_1 | avg_value_2 | month | year
     5      |      4      |   1   | 2009
     2      |      1      |   2   | 2009
     7      |      5      |   3   | 2009
     0      |      0      |   4   | 2009 <---
     6      |      5      |   5   | 2009
     3      |      6      |   6   | 2009
选择AVG(value1)作为AVG_值_1,
平均值(值2)作为平均值2,
月份(保存日期)为月份,
年(保存日期)为年
从myTable
其中保存日期介于“2009-01-01”和“2009-07-01”之间
按年份(保存日期)、月份(保存日期)分组
平均值1 |平均值2 |月|年
5      |      4      |   1   | 2009
2      |      1      |   2   | 2009
7      |      5      |   3   | 2009

0 | 0 | 4 | 2009最简单的方法可能是创建一个包含月份和年份的日期表,并将其与您的最终结果结合起来。

我同意Lieven的回答创建一个包含您可能需要的所有月份的表,并使用该表“左连接”到结果表中。请记住,这是一个非常小的表,每年只有365(ish)行数据。。。您可以很容易地编写一些代码来填充这个表

我们在这里这样做,它提供了很多好处,例如,想象一个月度数据表,其中包含以下字段(以及您可以想到的任何其他字段!),在给定范围内的所有月份都完全填充

  • 日期(如2009-04-01)
  • 日(如1)
  • 星期几(如星期三)
  • 月份(如4个月)
  • 年份(如2009年)
  • 财政年度(如2009/10)
  • 财政季度(如2009年第一季度)
  • 日历季度(如2009年第二季度)
然后将其与上面的查询相结合,如下所示

SELECT `DT`.`myYear`, `DT`.`myMonth`, AVG(`myTable`.`value1`) as avg_value_1, AVG(`myTable`.`value2`) as avg_value_2 FROM `dateTable` as DT LEFT JOIN `myTable` ON `dateTable`.`myDate` = `myTable`.`save_date` WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01' GROUP BY `DT`.`myYear`, `DT`.`myMonth` 选择'DT`.'myYear`、'DT`.'myMonth`, 平均值(`myTable`.`value1`)作为平均值1, 平均值(`myTable`.`value2`)作为平均值 从'dateTable'开始,作为DT 左JOIN`myTable` 在'dateTable'上。'myDate`='myTable`.'save\u date` 其中“dateTable”。“myDate”介于“2009-01-01”和“2009-07-01”之间 按'DT`.'myYear`、'DT`.'myMonth`分组` 我的SQL代码中可能有一些错误,因为我无法创建测试表,但希望您能够获得主体并进行更改以满足您的需要

使用此选项,您可以将“GROUPBY”子句更改为“dateTable”表中的任何内容,从而可以方便地按财务季度、月份、日期、星期几等进行报告


希望有帮助

谢谢你的回复,但我真的需要一个包含所有可能日期的表格吗?这不是最简单的方法!:)很难返回不存在的值。:)Lieven说得很好,但是MySQL在使用普通的GetDate()和DateAdd()等时会记住所有的日期。。我只是觉得一定有办法把它们取回来!