2009-05-21 261 views
4

我有一個表,其中包含社區事件的列表,包含事件開始和結束日期的列。如果結束日期爲0,則該事件僅在開始日發生。我有一個查詢,返回在任何給定的一天發生的事件數:MySQL獲取一個月的每一天的日期的行數

SELECT COUNT(*) FROM p_community e WHERE 
    (TO_DAYS(e.date_ends)=0 AND DATE(e.date_starts)=DATE('2009-05-13')) OR 
    (DATE('2009-05-13')>=DATE(e.date_starts) AND DATE('2009-05-13')<=DATE(e.date_ends)) 

我只是在任何日期我想分「2009-05-13」測試。

我需要能夠在整個月內每天獲取這些數據。我可以每次只針對每一天運行一次查詢,但我寧願運行一次查詢,以便一次性提供整個月份。有沒有人對我如何做到這一點有任何建議?

不,我不能使用存儲過程。

回答

9

嘗試:

SELECT COUNT(*), DATE(date) FROM table WHERE DATE(dtCreatedAt) >= DATE('2009-03-01') AND DATE(dtCreatedAt) <= DATE('2009-03-10') GROUP BY DATE(date); 

這將讓每一天的量,2009年5月

更新:現在工作在一個日期範圍跨度月/年。

+0

我想補充一個選擇幾列,但是這應該做到這一點。 – 2009-05-21 20:17:47

+0

這就是他在榜樣中所做的一切,所以我就這樣做了。 – Greg 2009-05-21 20:18:41

6

不幸的是,MySQL沒有辦法生成給定行數的行集。

您可以創建一個輔助表:

CREATE TABLE t_day (day INT NOT NULL PRIMARY KEY) 

INSERT 
INTO t_day (day) 
VALUES (1), 
     (2), 
     …, 
     (31) 

,並在JOIN使用它:

SELECT day, COUNT(*) 
FROM t_day 
JOIN p_community e 
ON  day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) 
GROUP BY 
     day 

或者你可以使用一個醜陋的子查詢:

SELECT day, COUNT(*) 
FROM (
     SELECT 1 AS day 
     UNION ALL 
     SELECT 2 AS day 
     … 
     UNION ALL 
     SELECT 31 AS day 
     ) t_day 
JOIN p_community e 
ON  day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) 
GROUP BY 
     day 
相關問題