Как вычесть 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() - INTERVAL 30 DAY
. Поскольку в вопросе упоминается «вычесть 30 дней из текущей даты и времени », это может быть не тем, что хочет ОП.current_timestamp
вместоcurrent_date
Давайте не будем использовать, так
NOW()
как вы теряете кеширование или оптимизацию запросов, потому что запрос каждый раз отличается. Смотрите список функций, которые вы не должны использовать в документации MySQL .В приведенном ниже коде предположим, что эта таблица растет со временем. Добавлен новый материал, и вы хотите показать только материал за последние 30 дней. Это самый распространенный случай.
Обратите внимание, что дата была добавлена в виде строки. Лучше добавить дату таким образом из вашего вызывающего кода, чем использовать
NOW()
функцию, поскольку она убивает ваше кеширование.Вы можете использовать,
BETWEEN
если вы действительно хотите что-то за эту секунду или за 30 дней до этой самой секунды, но, по моему опыту, это не частый случай использования, поэтому я надеюсь, что упрощенный запрос может вам пригодитьсяисточник
NOW()
и все еще использовать его в своем ответе. o_O PS: ваш запрос вернет другой результат, а не тот, который, вероятно, хочет OPBETWEEN
а>=
вы разные операторы, знаете? Мой запрос ограничивает набор результатов для30 days ago AND today
этогоeverything after 30 days ago
. Таким образом,tomorrow
записи не будут соответствовать моему и вашему исходному запросу, но будут соответствовать этому ответуMySQL отнимает дни с этого момента:
Печать:
Другие аргументы временного выражения интервала:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
источник
Вы также можете использовать
источник
Вы можете форматировать, используя формат даты в SQL.
источник
по-другому
источник
Если вам нужна только дата, а не время:
Так
curdate()
как компонент времени опускается, он потенциально быстрееnow()
и более «семантически корректен» в тех случаях, когда вас интересует только дата.Кроме того,
subdate()
2-арочная перегрузка потенциально быстрее, чем при использованииinterval
.interval
предназначен для случаев, когда вам нужен не дневной компонент.источник
subdate(curdate(), 30)
это быстрее, чемCURRENT_DATE - INTERVAL 30 DAY
? У тебя есть доказательства? И как быстро это будет? Несколько микросекунд?subdate
что потенциально более быстрое, по-вашему, как-то объясняется его "перегрузкой в 2 арности", но, пожалуйста, прости меня, если это глупый вопрос, что означают эти слова (в отношении функции )? В частности, что такое «2-арность»?curdate()
самом деле может быть неправильный выбор, потому что ФП, казалось, хотел «вычесть 30 дней из текущей даты и времени » (выделено мной).