2014-06-21 65 views
4

我得到了2列,'create_time'是帳戶已註冊的時間,'last_play'是上次帳戶登錄時的值。我想選擇已在特定的一週/每月註冊的帳戶,並且在此特定的一週/每月的最後兩天內一直處於活動狀態。MySQL從特定周/月的最後2天選擇條目

這是我如何選擇上週的所有條目,而不考慮last_play(作品):

SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW()); 

這是我上週當前查詢不工作:

SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW()) 
AND DATE(last_play) BETWEEN 
    ADDDATE(DATE(DATE_SUB(NOW(), INTERVAL 1 WEEK)), 
    INTERVAL 1 - DAYOFWEEK(DATE(NOW())) DAY) 
    AND DATE(NOW()); 
+0

看來你在回答時做了一個編輯。您能解釋一下您的意思嗎?「我想選擇已在特定的一週/一個月內註冊的帳戶,並且在此特定的一週/每月的最後兩天內一直處於活動狀態。」你的意思是星期六和星期天那個特定的一週? – davidhigh

+0

我剛剛編輯我的問題,使代碼更具可讀性。是的,我的意思是星期六和星期天。我現在會測試你的查詢! – Marius

回答

1

基礎上你的第一個工作查詢,你可以使用MySQL函數WEEKDAY來標識週六和週日:

SELECT COUNT(id) FROM account.account 
WHERE WEEKOFYEAR(create_time) = WEEKOFYEAR(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW()) 
AND WEEKOFYEAR(last_play) = WEEKOFYEAR(create_time) //last_play is in the same week as create_time 
AND WEEKDAY(last_play) IN (5,6); //wekkday is saturday or sunday 

這會爲您提供在星期六或星期日在註冊的同一周內處於活動狀態的條目。

編輯:幾個月來,你基本上做同樣的事情,但DAYOFMONTH通過MONTHWEEKDAY更換WEEKOFYEAR。一個給定月份的最後兩天,你可以通過checing所有可能的情況下,手動發現:

SELECT COUNT(id) FROM account.account 
WHERE MONTH(create_time) = MONTH(NOW()) - 1 
AND YEAR(create_time) = YEAR(NOW()) 
AND MONTH(last_play) = MONTH(create_time) //last_play is in the same MONTH as create_time 
AND 
    (DAYOFMONTH(last_play) IN (30,31) AND MONTH(last_play) IN (1,3,5,7,8,10,12) 
    OR DAYOFMONTH(last_play) IN (29,30) AND MONTH(last_play) IN (4,6,9,11) 
    OR DAYOFMONTH(last_play) IN (27,28) AND MONTH(last_play) IN (2)) 

沒關係閏年;-)。或者自己再手動合併它。

+0

'last_play> = DATE_SUB(NOW(),INTERVAL 2 DAY)'從現在開始只有2天,但我想檢查該特定周的最後2天。 – Marius

+0

我編輯了我的答案,有一個試用版。 – davidhigh

+0

謝謝,這就是我需要的!我仍然需要找到一個解決方案,幾個月你不知道哪一週是最後兩個。 – Marius