Возможный дубликат:
Получить из базы данных, но только последние 30 дней
 Привет, У меня есть код php, который я использую для подсчета строк в базе данных за последние 30 дней.  Проблема в том, что если я изменю кусок кода так, чтобы число менялось от -30 до -20 , выходной номер переместился от 272 до 360 а не вниз. 
Вот код:
 $result = mysql_query("SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) = -30 and member ='000002'"); $num_rows60 = mysql_num_rows($result); 
       
		Попробуй это
 select * from `table` where `yourfield` >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) 
Например, дни, год см. Ниже.
 DATE_SUB(CURDATE(), INTERVAL 15 DAY) /*For getting record specific days*/ DATE_SUB(CURDATE(), INTERVAL 1 YEAR) /*for getting records specific years*/ 
Для Ананда запрос
 BETWEEN DATE_SUB( CURDATE( ) ,INTERVAL 6 MONTH ) AND DATE_SUB( CURDATE() ,INTERVAL 3 MONTH ) /* For Getting records between last 6 month to last 3 month 
Лучше сравнить
 `date`< DATE(NOW() - INTERVAL 30 DAY) 
скорее, чем
  DATEDIFF(date,NOW()) = -30 
В первом случае расчет даты выполняется только один раз, в начале запроса, и база данных может использовать любые индексы в столбце даты.
  Второй запрос должен рассчитать DATEDIFF для каждой строки, и база данных не может использовать какие-либо индексы.  Второй запрос заставляет полностью сканировать таблицу. 
  Кроме того, я настоятельно рекомендую вам не называть date столбца.  Да, я знаю, что вы можете процитировать имя с помощью обратных ссылок, но это просто беспорядочно, и когда вы забудете, ваши синтаксические ошибки будут трудно забыть.  Придумайте более описательное имя для столбца.  Какая дата?  Что представляет собой дата? 
Вы можете использовать это вместо этого:
 $result = mysql_query("SELECT * FROM all_count WHERE `date`< DATE(NOW() - INTERVAL 30 DAY) and member ='000002'"); 
  Как вы можете видеть в документации здесь , функция DATEDIFF в MySQL сообщает вам разницу в днях первой даты ко второй. 
В вашем запросе выбираются только все строки, где разница составляет ровно 30 дней, а не те, которые до 30 дней назад. Поэтому вполне возможно, что количество строк для даты 20 дней назад выше, чем 30 дней назад. Скорее всего, вы хотели:
 SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) >= -30 and member ='000002'