Получение mysql за последние 30 дней

Возможный дубликат:
Получить из базы данных, но только последние 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'