【问题标题】:MySQL to get the count of rows that fall on a date for each day of a monthMySQL获取一个月中每一天的日期的行数
【发布时间】:2009-05-21 20:10:54
【问题描述】:

我有一个表格,其中包含社区活动列表,其中包含活动开始和结束日期的列。如果结束日期为 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”的任何日期中加入。

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

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试:

    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 月每天的金额。

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

    【讨论】:

    • 我会在选择中添加几列,但是应该这样做。
    • 这就是他在示例中的全部内容,所以我继续使用。
    • 如果每个事件都是一个日期,这将起作用,但我正在处理每个项目的日期范围。每个事件都从 date_starts 到 date_ends,所以如果一个事件是 5 月 10 日到 5 月 14 日,我需要能够识别 5 月 12 日。
    • 我想我可能会对您对您正在寻找的解决方案的解释感到困惑。
    • 是的,我想你搞错了。 Quassnoi 似乎得到了我想要做的事情。
    【解决方案2】:

    不幸的是,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
    

    【讨论】:

    • 谢谢,这正是我所期望的。我不知道 BETWEEN 关键字,这比我想出的要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多