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