Mysql按月查询

时间:2012-07-30 05:22:18

标签: mysql group-by monthcalendar

我希望从表中获取所有行

where date >='2012-05-05' and date<='2012-07-20'

我希望MySQL从

增加明确递增"group by"
2012-05-05 to 2012-06-05(incerement 1 month)
2012-06-06 to 2012-07-06(increment 1` month)
and remaining 2012-07-07 to 2012-07-20 (group the remaining 14 days)

如何编写查询以实现相同的目标?

谢谢...

3 个答案:

答案 0 :(得分:5)

试试这个解决方案:

您可以通过TIMESTAMPDIFF()函数GROUP BY从参数最小值(2012-05-05)+ 1到每行的日期经过的月数:

GROUP BY TIMESTAMPDIFF(MONTH, '2012-05-05' + INTERVAL 1 DAY, date)

我们为您的最小参数+1天的原因是:

  • 2012-05-052012-06-04为0个月,但是......
  • 2012-05-052012-06-05为1个月

^因此,2012-06-05上的行将与我们实际希望将它们分组的0个月后的日期分开分组。


编辑:我正在摆弄此解决方案,不仅按月间隔进行分组,而且还显示 来自 每个间隔的 日期。

检查出来:

SQLFiddle Demo

答案 1 :(得分:0)

您可以使用case expression,然后按case的结果分组。

SELECT 
  CASE 
    WHEN where date >='2012-05-05' and date<='2012-06-05' THEN 1 
    WHEN where date >='2012-06-06' and date<='2012-07-06' THEN 2 
    ELSE 3 
  END AS period, COUNT(*)
FROM your_table
GROUP BY period

答案 2 :(得分:0)

希望这个帮助,我假设日期范围是动态的,如下:

2012-01-01 to 2012-02-01
2012-02-02 to 2012-03-02
2012-03-03 to 2012-04-03
2012-04-04 to 2012-05-04
2012-05-05 to 2012-06-05
...

所以,我可以使用以下方式对其进行分组:

SELECT *, IF(day(date)>=month(date), month(date), month(date)-1) as PERIOD 
FROM your_tablename 
GROUP BY PERIOD;