2011-10-07 55 views
0

我有一些我想要检索的数据,但我希望按特定秒数分组。例如,如果我的表看起来像这样:按时间段分组的结果

| id | user | pass | created | 

created列INT并持有时间戳(从1970年的秒数)。

我想要在上个月和当前日期之间创建的用户数,但按照7*24*3600(一周)显示他们的分组数。因此,如果在该范围内有1000个新用户,让他们显示每周注册多少次(第一周100次,第二周450次,第三次50次,第四周400次 - 如此)。

我试着通过created/7*24*3600分组的结果,但不工作。

我的查询应该怎么样?

+0

什么样的列的是'created'? –

+0

对不起,忘了提及它。它是INT,它在几秒钟内拥有一个时间戳。 –

回答

2

您需要使用整数除法div否则结果将变成真实的,并且周中没有一个会解析为相同的值。

SELECT 
    (created div (7*24*60*60)) as weeknumber 
    , count(*) as NewUserCount 
FROM users 
WHERE weeknumber > 1 
GROUP BY weeknumber 

参见:http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html

+0

谢谢,您的解决方案为我提供了一个重要的信息:'div' –

+1

+1但考虑到'div'是特定于mysql的语法。使用SQL2003标准函数'floor()'也可以达到同样的效果。 –

+0

@XaviLópez,在SQL服务器中,如果两个操作数都是整数,那么'/'操作符会返回一个trucated整数。 – Johan

1

好这里是可能的选项,你可以尝试:

GROUP BY DAY

select count(*), DATE_FORMAT(created_at,"%Y-%m-%d") as created_day FROM widgets GROUP BY created_day 

GROUP BY MONTH

select count(*), DATE_FORMAT(created_at,"%Y-%m") as created_month FROM widgets GROUP BY created_month 

GROUP BY YEAR

select count(*), DATE_FORMAT(created_at,"%Y") as created_year FROM widgets GROUP BY created_year 
2

你必须保持整数部分只是分工。你可以用floor()函数来完成。

你试过select floor(created/604800) as week_no, count(*) from users group by floor(created/604800)

我假设你已经有了“上个月创建的选择用户”部分。

+0

谢谢。我的问题是我使用'/'运算符来执行分区,而不是'div'。但主要想法就像你的查询。 –