在MySQL中按月和按年分组

时间:2010-07-29 20:59:43

标签: sql mysql group-by date

如果每个行都有一个时间戳表,那么如何格式化查询以适应这种特定的json对象格式。

我正在尝试将json对象组织成数年/月。

json以查询为基础:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}

这是我到目前为止的查询 -

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC";

查询正在破裂,因为它(可预见地)将不同年份汇总在一起。

13 个答案:

答案 0 :(得分:150)

GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

是你想要的。

答案 1 :(得分:59)

GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')

答案 2 :(得分:8)

SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM trading_summary t
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC

应该在YEAR和Month使用DESC才能获得正确的订单。

答案 3 :(得分:5)

我更喜欢

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";

答案 4 :(得分:3)

我知道这是一个古老的问题,但是如果您不需要数据库级别的月份名称,则下面的方法应该起作用:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;

See EXTRACT function docs

您可能会发现它的性能更好。.并且,如果您在应用程序层中构建JSON对象,则可以在运行结果时进行格式化/排序。

NB :我不知道您可以将DESC添加到MySQL中的GROUP BY子句中,也许您缺少ORDER BY子句:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;

答案 5 :(得分:2)

你必须做这样的事情

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`),
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay

答案 6 :(得分:1)

使用像这样的EXTRACT函数

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
       -> 2009

答案 7 :(得分:0)

您只按月分组,您必须通过

将YEAR()添加到组中

答案 8 :(得分:0)

SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

仍然需要在外部脚本中处理它以获得您正在寻找的结构。

例如,使用PHP的爆炸从月份名称列表创建数组,然后使用json_encode()

答案 9 :(得分:0)

您也可以这样做

SELECT  SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12

按年份和月份订购。假设您要从今年和本月起一直订购到12个月

答案 10 :(得分:0)

这是我的方法:

GROUP BY  EXTRACT(YEAR_MONTH FROM t.summaryDateTime);

答案 11 :(得分:-1)

我想按年份(日期时间)、月份(日期时间)和按提取物(日期时间的年份_月份)添加分组之间的差异。 这是我在这两种情况下尝试的查询。

从表中选择年(datetimecol)作为年,月名(datetimecol)作为月
按年(datetimecol)和月(datetimecol)按年(datetimecol)desc排序;

结果:

年、月

2020 年 5 月

从表中选择年(datetimecol)作为年,月名(datetimecol)作为月 GROUP BY EXTRACT(YEAR_MONTH FROM datetimecol) order by year(datetimecol) desc,month(datetimecol) asc;

结果:

年、月

2021 年 1 月 2021年二月 2021年3月 2021 年 4 月 2021 年 5 月 2020 年 5 月 2020 年 6 月 2020 年 7 月 2020年8月 2020 年 9 月 2020 年 10 月 2020 年 11 月 2020 年 12 月

(这是我需要的结果)

我的观察 1.当我与 group by year(datetimecol),month(datetimecol) 一起使用时,没有给出预期的结果..可能是因为 datetime field ... 2.当我用 GROUP BY EXTRACT(YEAR_MONTH FROM datetimecol) order by year(datetimecol) 厌倦了第二次查询时......它工作得很好。

总而言之,要逐年获取月数,请使用以下查询。

从表中选择年(datetimecol)作为年,月名(datetimecol)作为月 GROUP BY EXTRACT(YEAR_MONTH FROM datetimecol) order by year(datetimecol) desc,month(datetimecol) asc;

答案 12 :(得分:-2)

使用

GROUP BY year, month DESC";

而不是

GROUP BY MONTH(t.summaryDateTime) DESC";