2009-05-21 292 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 
相关问题