2012-07-30 161 views
3

我期待這樣做從表MySQL查詢的GROUP BY月

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) 

遞增我怎麼寫我的查詢實現相同?

謝謝...

+0

這樣你會返回行*月加一天*,而不僅僅是*月*。 – 2012-07-30 09:51:04

回答

5

嘗試這種解決方案:

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

您可以通過TIMESTAMPDIFF()功能GROUP BY每一行從參數最小值(2012-05-05)+ 1逝去的日期的月數我們+1天到達最小參數的原因是因爲:

  • 2012-05-052012-06-04爲0個月,但...
  • 2012-05-052012-06-05爲1個月

^正因爲如此,在2012-06-05行(S)將分別從該日期有0個月經過分組當我們真的希望它們與他們分組。


編輯:我用這個解決方案不僅按月間隔分組擺弄周圍,而且從和顯示每個區間的日期。

檢查出來:

SQLFiddle Demo

+0

我可以顯示日期範圍mysql是通過使用上述技術分組嗎?\ – 2012-07-30 07:14:15

+0

@ user1537158看看我在SQLFiddle演示中做了什麼。它看起來有點混亂和複雜,但它的工作原理。只需插入分別表示「2012-05-05」和「2012-07-20」的最小和最大參數即可。此外,請確保您在演示中包含'GROUP BY'中的'fromdate'和'todate'列。 – 2012-07-30 07:17:11

+0

哇,完美的作品,非常感謝 – 2012-07-30 07:24:34

0

您可以通過對case結果使用case expression,然後組。

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 
+0

能否詳細說明一下? 也許帶有僞代碼? – 2012-07-30 05:28:59

+0

但朋友的日期範圍是動態選擇的,而不是靜態的,舉例來說,我提到他們的日期可能是從2012-01-24到2012-12-01 – 2012-07-30 05:39:00

+0

@ user1537158這只是一個例子,你應該定義你的你自己的範圍 – xdazz 2012-07-30 05:41:45

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;