2015-10-16 50 views
0

如果我有一个包含有他们的登记日期(即2015年1月1日)所谓的“补充” datetime列用户信息,我该怎么让注册的所有记录的计数/每下列期间活跃的表:根据活动时间长度显示来自表格的记录数量?

1)少于一年 2)1至2年 3)2至3年 4)...等等,只要“增加”的时间越长。

我已经试过这样:

SELECT Count(*) AS count, YEAR(CURDATE()) - YEAR(added) AS years 
FROM users 
GROUP BY YEAR(added) 

但是,钙是关闭的,因为它只是组的结果按年份,而不是从今天的实际日期。正如,有人在2014年12月注册还是会出来显示为计数“1” 2015年1月...即使在现实中,实际注册日期应该被考虑在内,而不仅仅是一年。

对此提出建议?

+0

' GROUP BY年份? –

回答

1

试试这个:

SELECT Count(*) AS count, 
SUM(IF (DATE_ADD(added, INTERVAL 1 YEAR) > NOW(), 1, 0)) AS num_1year, 
SUM(IF (DATE_ADD(added, INTERVAL 1 YEAR) < NOW() AND DATE_ADD(added, INTERVAL 2 YEAR) > NOW(), 1, 0)) AS num_2year, 
SUM(IF (DATE_ADD(added, INTERVAL 2 YEAR) < NOW() AND DATE_ADD(added, INTERVAL 3 YEAR) > NOW(), 1, 0)) AS num_3year 
FROM users 
+0

美女!这几乎就是......在第3行结尾处缺少一个逗号,但这就是它!谢谢你......现在一切都合情合理。 –

+0

不客气:) –

+0

你将如何计算每年只有唯一的用户?如同在2014年,如果有人在2014年被添加,我不会在2015年计算他,假设user_id是存储用户ID的字段,并且多年来单个user_id可以注册多个课程/成员资格。有什么建议么? –

0

由于您使用的是GROUP BY语句,需要在选择部分聚合函数。

SELECT Count(*) AS count, YEAR(CURDATE() - YEAR(added) AS years 
FROM users    ^^^ no way to group 
GROUP BY YEAR(added) 

使用DATEDIFF函数计算日期差异。

SELECT Count(*) AS count, FLOOR(DATEDIFF(CURDATE() - added)/365) AS year_diff 
FROM users    
GROUP BY years_diff 

PS:这是不完全准确的,因为假定一年365年。但它支持任何一年的范围,你不会有改变这种从N至N + 1年支持差异。

0

你可以试试这个:

1)不到一年的时间

SELECT COUNT(*) as num FROM users WHERE TIMESTAMPDIFF(MONTH, added, NOW()) < 12 

2)1和2岁之间

SELECT COUNT(*) as num FROM users WHERE DATEDIFF(added, NOW()) BETWEEN 1 AND 2