Select 在具有计数条件的日期之间

Select between dates with count condition

我有 table userlogin_time

我想select一个月内登录超过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;

我不确定我的select日期之间的离子。 我如何 select 以一个月为间隔避免重复记录。 例如,如果我有 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 的月份范围内。 那么我会得到该值的双重记录吗?

要查找在当前结束的月份内登录次数超过 10 次的用户,请执行此操作。

SELECT COUNT(*) times_logged_in,
       userid
  FROM user
 WHERE login_time >= NOW() - INTERVAL 1 MONTH
 GROUP BY user_id
HAVING COUNT(*)> 10

要在您的 table 中查找在任何日历月登录超过十次的用户,请执行此操作。

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 总是落在您指定的间隔内。

编辑: 如果你愿意,你可以GROUP BY MONTH(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/