Ako je signupdate 31.01.2009. onda pretpostavljam da želiš da sledeći mesec počne zadnjeg dana u februaru (28.02.2009. ili 29.02.2012.)
Moj predlog je da dodaš novo polje "current_month" i da pokrećeš sledeći query svakog dana (recimo jedan minut posle ponoći):
UPDATE users_table
SET current_month = current_month + 1
WHERE DAYOFMONTH(signupdate) = DAYOFMONTH(NOW())
OR (LAST_DAY(NOW()) = DATE(NOW()) AND DAYOFMONTH(signupdate) > DAYOFMONTH(NOW()))
Onda za pravljenje izveštaja možeš koristiti:
SELECT u.user_id, u.signupdate, COUNT(v.id) AS current_month_visit_count
FROM users_table AS u
LEFT JOIN visits_table AS v ON u.user_id = v.user_id
WHERE v.visitdate BETWEEN DATE_ADD(u.signupdate, INTERVAL u.current_month MONTH) AND DATE_ADD(u.signupdate, INTERVAL u.current_month+1 MONTH)
GROUP BY u.user_id
"Common sense is not so common." - Voltaire