3

我想做一些事情,比如从表中获取所有行

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

我希望 MySQL 返回"group by"行 mont wise 从

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)

我怎样才能编写我的查询来达到同样的效果?

谢谢...

4

3 回答 3

5

试试这个解决方案:

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

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

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

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

^ 因此,2012-06-05当我们实际希望将其与它们分组时,将与已过去 0 个月的日期分开分组。


编辑:我在摆弄这个解决方案,不仅按月间隔分组,而且还显示每个间隔的开始日期结束日期。

看看这个:

SQLFiddle 演示

于 2012-07-30T06:48:24.787 回答
0

您可以使用case 表达式,然后根据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
于 2012-07-30T05:26:10.583 回答
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;
于 2012-07-30T07:43:52.457 回答