Как вычесть 30 дней из текущего datetime в mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Как вычесть 30 дней из текущего datetime в mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Для тех, кто не хочет использовать DATE_SUB, используйте CURRENT_DATE:
SELECT CURRENT_DATE - INTERVAL 30 DAY
 Давайте не будем использовать NOW() как вы теряете кэширование или оптимизацию запросов, потому что запрос каждый раз отличается. Смотрите список функций, которые вы не должны использовать в документации по MySQL.
В приведенном ниже коде предположим, что эта таблица растет со временем. Добавлен новый материал, и вы хотите показать только материал за последние 30 дней. Это самый распространенный случай.
 Обратите внимание, что дата была добавлена в виде строки. Лучше добавить дату таким образом из вашего вызывающего кода, чем использовать функцию NOW() как она убивает ваше кеширование.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
 Вы можете использовать BETWEEN если вы действительно просто хотите что-то за эту секунду или за 30 дней до этой самой секунды, но, по моему опыту, это не частый случай использования, поэтому я надеюсь, что упрощенный запрос может вам пригодиться.
Вы также можете использовать
select CURDATE()-INTERVAL 30 DAY
MySQL отнимает дни с этого момента:
select now(), now() - interval 1 day
Печать:
2014-10-08 09:00:56     2014-10-07 09:00:56
Другие аргументы временного выражения интервала:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Вы можете форматировать, используя формат даты в SQL.
другой способ
SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
Если вам нужна только дата, а не время:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
Так как curdate() опускает компонент времени, он потенциально быстрее, чем now() и более "семантически корректный" в тех случаях, когда вас интересует только дата.
Кроме того, перегрузка subdate() 2-arity потенциально быстрее, чем использование interval.
interval предназначен для случаев, когда вам нужен недневный компонент.