【问题标题】:How to select rows in every day between two dates using MySQL如何使用 MySQL 在两个日期之间的每一天中选择行
【发布时间】:2022-01-06 02:08:15
【问题描述】:

我想跟踪两个日期之间每天登录的用户。 假设我有一张这样的表my_table

user_id login_datetime
1 2021-10-02 10:00:00
1 2021-10-02 12:00:00
2 2021-10-02 12:20:00
1 2021-10-03 17:00:00
1 2021-10-04 22:00:00
2 2021-10-04 23:00:00

给定的日期范围是从“2021-10-02”到“2021-10-04”。

在这种情况下我想获取 user_id = 1,因为 user_id = 2 没有在 '2021-10-03' 登录

结果

user_id login_date
1 2021-10-02
1 2021-10-03
1 2021-10-04

有什么解决办法吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    一种方法使用聚合:

    SELECT user_id
    FROM my_table
    WHERE login_datetime >= '2021-10-02' AND login_datetime < '2021-10-05'
    GROUP BY user_id
    HAVING COUNT(DISTINCT DATE(login_datetime)) = 3;  -- range has 3 dates in it
    

    Demo

    HAVING 子句断言任何匹配的用户必须存在 3 个不同的日期,这意味着此类用户将在从 2021 年 10 月 2 日到 2021 年 10 月 4 日(含)的所有日期进行登录活动。

    编辑:

    要在您的问题中获得准确的输出,您可以使用:

    SELECT DISTINCT user_id, DATE(login_datetime) AS login_date
    FROM my_table
    WHERE user_id IN (
        SELECT user_id
        FROM my_table
        WHERE login_datetime >= '2021-10-02' AND login_datetime < '2021-10-05'
        GROUP BY user_id
        HAVING COUNT(DISTINCT DATE(login_datetime)) = 3
    );
    

    【讨论】:

    • 感谢您的关注。我有个问题。有没有办法得到上面的表格结果?
    • @Silverstar 我想我错过了您的预期输出。查看我更新的答案,了解一种方法。
    • 请注意,在实践中,如果您从应用程序(例如 Java 或 PHP)调用此查询,您可能实际上想要使用第一个版本。一旦你得到一个匹配的user_id,你就会自动知道这个用户匹配了整个日期范围,所以让 SQL 做更多的工作来重新生成这个范围可能会浪费计算时间。只是一个想法:-)
    • 是的。我同意。你说的对。第二个查询并不重要。只是我想要一张配方表。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多