我有表user
,其中包含login_time
列。
我想选择一个月内登录次数超过 10 次的所有用户。
我尝试过这样的事情:
SELECT login_time, count(id) as loginCount FROM user
WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time
GROUP BY id, MONTH(login_time) HAVING loginCount > 10;
我不确定我在日期之间的选择。
如何以一个月为间隔进行选择以避免重复记录。
例如,如果我有以下 login_time
值:
1. '2015-02-01 14:05:19'
2. '2015-01-21 14:05:19'
3. '2015-01-11 14:05:19'
3 和 2 都在 1 的月份范围内。 那么我会得到该值的双记录吗?
最佳答案
要查找在截至目前的月份中登录次数超过十次的用户,请执行以下操作。
SELECT COUNT(*) times_logged_in,
userid
FROM user
WHERE login_time >= NOW() - INTERVAL 1 MONTH
GROUP BY user_id
HAVING COUNT(*)> 10
要查找表中任意日历月内登录次数超过 10 次的用户,请执行以下操作。
SELECT COUNT(*) times_logged_in,
DATE(DATE_FORMAT(login_time, '%Y-%m-01')) month_beginning,
userid
FROM user
GROUP BY user_id, DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
HAVING COUNT(*)> 10
这里的技巧是表达式DATE(DATE_FORMAT(login_time, '%Y-%m-01'))
,它将任何时间戳转换为其发生月份的第一天。
您的问题提到了这个WHERE
条件:
WHERE login_time between DATE_SUB(login_time INTERVAL 1 month) AND login_time
这并没有做任何有趣的事情,因为它总是返回 true。每个给定的 login_time
始终落在您指定的时间间隔内。
编辑:如果需要,您可以按月分组(dt)
。但我显示它的方式自动考虑了数年和数月,所以在我看来,它更适合准确的报告。
另一次编辑:此公式得出任何给定日期或时间戳项的前一个星期日。
FROM_DAYS(TO_DAYS(login_time) -MOD(TO_DAYS(login_time) -1, 7))
如果星期一是您所在管辖区一周的第一天,请将 -1
更改为 -2
。按此函数进行分组优于 GROUP BY WEEK(login_time)
,因为 WEEK()
在日历年的开始和结束时会执行奇怪的操作。
这一切都在这里更详细地写了:http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
关于mysql - 在具有计数条件的日期之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385223/