MySQL根据TIMESTAMP分组几个月

时间:2010-08-18 16:22:52

标签: mysql

我有一个名为user_logins的表,用于跟踪用户登录系统。它有三列,login_id,user_id和login_time

login_id(INT) | user_id(INT) | login_time(TIMESTAMP)
------------------------------------------------------
  1       |      4       |   2010-6-14 08:54:36
  1       |      9       |   2010-7-16 08:56:36
  1       |      9       |   2010-8-16 08:59:19
  1       |      9       |   2010-8-16 09:00:24
  1       |      1       |   2010-8-16 09:01:24

我希望编写一个查询来确定每天的唯一登录次数,并计算每个月的登录次数。如果用户在一天内登录了两次,则只会计算一次。示例输出如下

month(VARCHAR) | logins(INT)
---------------------------
 June       |     1
 July       |     1
 August     |     2
结果表中的

8月只有2,因为user_id 9在一天内登录了两次而他登录系统只计为当天的1次登录。

在堆栈溢出的帮助下,我编写了一个实现此目的的查询,但出于某种原因使用当我使用DATE_FORMAT函数而只是'%M'时尝试使用hibernate读取java中的值时它会导致对象被破坏而不被识别为字符串。我想这可能是因为我的查询做错了。我的查询如下:

 SELECT login_date, SUM(logins) as numLogins FROM (
    SELECT
      DATE_FORMAT(DATE(login_time), '%M') AS login_date,
      COUNT(DISTINCT login_id) AS logins
    FROM user_logins
    WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR)
    GROUP BY DATE(login_time)) 
 AS Z GROUP BY(login_date)";

1 个答案:

答案 0 :(得分:1)

为什么不使用extract(login_time中的月份)将月份作为数值?

SELECT extract(month from login_time),
       COUNT(DISTINCT login_id) AS logins
FROM user_logins
WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR)
GROUP BY extract(month from login_time)