MySQL用于获取每月每天的日期行数

Chi*_*oft 4 mysql sql

我有一个表,其中包含社区事件列表,其中包含事件开始和结束日期的列.如果结束日期为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))
Run Code Online (Sandbox Code Playgroud)

我想在"2009-05-13"中测试任何日期.

我需要能够在一个月内每天获取这些数据.我可以一次只针对每一天运行查询,但我宁愿运行一个可以一次给我整个月的查询.有没有人对我如何做到这一点有任何建议?

不,我不能使用存储过程.

Gre*_*reg 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);
Run Code Online (Sandbox Code Playgroud)

这将获得2009年5月每天的金额.

更新:现在适用于跨越数月/年的一系列日期.


Qua*_*noi 6

不幸的是,MySQL缺少一种生成给定行数的行集的方法.

您可以创建一个帮助程序表:

CREATE TABLE t_day (day INT NOT NULL PRIMARY KEY)

INSERT
INTO    t_day (day)
VALUES  (1),
        (2),
        …,
        (31)
Run Code Online (Sandbox Code Playgroud)

并在以下方面使用它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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用丑陋的子查询:

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
Run Code Online (Sandbox Code Playgroud)