我有一个表,其中包含社区事件列表,其中包含事件开始和结束日期的列。如果结束日期为0,则事件仅在开始日发生。我有一个查询,它返回在任何一天发生的事件数量:
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”中测试任何日期。
我需要能够在整个月内每天获取此数据。我可以一次只针对每一天运行查询,但我宁愿运行一个查询,它可以立即给我整个月。有没有人对我怎么做?
不,我不能使用存储过程。
答案 0 :(得分: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月每天的金额。
更新:现在适用于跨越数月/年的一系列日期。
答案 1 :(得分: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