在MySQL中按月和按年分组

Der*_*air 78 mysql sql group-by date

给定一个在每一行上都有时间戳的表,如何格式化查询以适应这种特定的json对象格式.

我试图将json对象组织成数年/月.

json将查询基于:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}
Run Code Online (Sandbox Code Playgroud)

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

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

查询正在崩溃,因为它(可预见地)将不同年份汇总在一起.

Mit*_*sey 162

GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;
Run Code Online (Sandbox Code Playgroud)

是你想要的.

  • +1:使用[DATE_FORMAT](http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format)的另一种选择:`DATE_FORMAT(t.summaryDateTime, '%Y-%M')` (52认同)
  • 性能...我对 `GROUP BY YEAR(date), MONTH(date) DESC;` (~450 ms) 和 `GROUP BY DATE_FORMAT(date,'%Y-%m')` (~850 ms) 的测试一个包含超过 300,000 个条目的 InnoDB 表显示前者(该问题的标记答案)花费的时间大约是后者的一半。 (4认同)
  • 此外,如果你的UNIX中有一个UNIX时间戳,则需要[FROM_UNIXTIME](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_from-unixtime) DB`DATE_FORMAT(FROM_UNIXTIME(t.summaryDateTime),'%Y-%m')` (3认同)

Fer*_*ÇER 65

GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
Run Code Online (Sandbox Code Playgroud)


Sas*_*u H 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
Run Code Online (Sandbox Code Playgroud)

应该在YEAR和Month使用DESC来获得正确的订单.


Art*_*rth 8

我知道这是一个老问题,但如果您不需要数据库级别的月份名称,以下应该可以工作:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;
Run Code Online (Sandbox Code Playgroud)

请参阅 EXTRACT 函数文档

您可能会发现这样的性能更好……如果您正在应用程序层构建 JSON 对象,您可以在运行结果时进行格式化/排序。

注意,我不知道您可以将 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;
Run Code Online (Sandbox Code Playgroud)


Joh*_*ell 6

我更喜欢

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