2015-10-16 52 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