代码之家  ›  专栏  ›  技术社区  ›  Derek Adair

在MySQL中按月份和年份分组

  •  70
  • Derek Adair  · 技术社区  · 14 年前

    给定一个每行都有时间戳的表,您将如何格式化查询以适应这个特定的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";
    

    这个查询正在崩溃,因为它(可以预见)将不同的年份集中在一起。

    11 回复  |  直到 14 年前
        1
  •  199
  •   Arth    4 年前
    GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime);
    

    是你想要的。

        2
  •  83
  •   Ferhat KOÇER    10 年前
    GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
    
        3
  •  10
  •   Arth    4 年前

    我更喜欢

    SELECT
        MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
    FROM
        trading_summary t 
    GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime);
    
        4
  •  8
  •   Sasindu H    11 年前
    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
    

    应使用DESC的年和月,以获得正确的顺序。

        5
  •  8
  •   Arth    6 年前

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

    See EXTRACT function docs

    注意。 我不知道您可以在MySQL中将DESC添加到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;
    
        6
  •  2
  •   Marwelln    10 年前

    你必须这样做

    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
    
        7
  •  2
  •   Niclausel    6 年前

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

        8
  •  2
  •   CTBrewski    5 年前

    我就是这样做的:

    GROUP BY  EXTRACT(YEAR_MONTH FROM t.summaryDateTime);
    
        9
  •  1
  •   Eduardo Rascon    14 年前

        10
  •  1
  •   Carl0s1z Asbar    8 年前

    像这样使用提取函数

    mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
           -> 2009
    
        11
  •  0
  •   Mchl    14 年前
    SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
    FROM trading_summary t GROUP BY yr
    

    仍然需要在外部脚本中对其进行处理,以获得所需的结构。

    例如,使用PHP的explode从月份名称列表创建一个数组,然后使用json\u encode()

        12
  •  -2
  •   Kyra    14 年前

    GROUP BY year, month DESC";
    

    而不是

    GROUP BY MONTH(t.summaryDateTime) DESC";