Как вычесть 30 дней из текущего datetime в MySQL?

197

Как вычесть 30 дней из текущего datetime в MySQL?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
user784637
источник

Ответы:

128

Для тех, кто не хочет использовать DATE_SUB, используйте CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Даг Фир
источник
2
Я бы дал +10, если бы мог. SQL должен быть полностью удобочитаемым, и это самый читаемый способ сделать это.
Colin 't Hart
9
Более читаемый, но другой результат, чем при использовании NOW() - INTERVAL 30 DAY. Поскольку в вопросе упоминается «вычесть 30 дней из текущей даты и времени », это может быть не тем, что хочет ОП.
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ тогда используйте current_timestampвместоcurrent_date
isapir
21

Давайте не будем использовать, так NOW()как вы теряете кеширование или оптимизацию запросов, потому что запрос каждый раз отличается. Смотрите список функций, которые вы не должны использовать в документации MySQL .

В приведенном ниже коде предположим, что эта таблица растет со временем. Добавлен новый материал, и вы хотите показать только материал за последние 30 дней. Это самый распространенный случай.

Обратите внимание, что дата была добавлена ​​в виде строки. Лучше добавить дату таким образом из вашего вызывающего кода, чем использовать NOW()функцию, поскольку она убивает ваше кеширование.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

Вы можете использовать, BETWEENесли вы действительно хотите что-то за эту секунду или за 30 дней до этой самой секунды, но, по моему опыту, это не частый случай использования, поэтому я надеюсь, что упрощенный запрос может вам пригодиться

Джозеф Ласт
источник
3
Таким образом, вы предложили не использовать NOW()и все еще использовать его в своем ответе. o_O PS: ваш запрос вернет другой результат, а не тот, который, вероятно, хочет OP
zerkms
@zerkms Как этот запрос даст другой набор результатов, чем ваш запрос?
user784637
2
@ user784637: хм, BETWEENа >=вы разные операторы, знаете? Мой запрос ограничивает набор результатов для 30 days ago AND todayэтого everything after 30 days ago. Таким образом, tomorrowзаписи не будут соответствовать моему и вашему исходному запросу, но будут соответствовать этому ответу
zerkms
Хорошо мой плохой Обычно такие запросы находятся в живых таблицах, которые растут со временем. Вот почему я бросил между ними. Я разъяснил свой ответ выше.
Джозеф Ласт
@JosephLust, чтобы решить проблемы с производительностью, используйте вместо этого мое решение .
Pacerier
17

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 
Эрик Лещинский
источник
16

Вы также можете использовать

select CURDATE()-INTERVAL 30 DAY
Ноби Нирмал
источник
1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Вы можете форматировать, используя формат даты в SQL.

Варадж Виньеш
источник
0

по-другому

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
zzapper
источник
0

Если вам нужна только дата, а не время:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

Так curdate()как компонент времени опускается, он потенциально быстрее now()и более «семантически корректен» в тех случаях, когда вас интересует только дата.

Кроме того, subdate()2-арочная перегрузка потенциально быстрее, чем при использовании interval. intervalпредназначен для случаев, когда вам нужен не дневной компонент.

Pacerier
источник
11
Итак, вы утверждаете, что subdate(curdate(), 30)это быстрее, чем CURRENT_DATE - INTERVAL 30 DAY? У тебя есть доказательства? И как быстро это будет? Несколько микросекунд?
ypercubeᵀᴹ
2
Я понятия не имею. Я, конечно, не могу высказать свои собственные комментарии. Что касается «потенциально» более быстрого заявления, я до сих пор не вижу никаких доказательств, решительных или косвенных. И даже если это будет несколько быстрее, условие будет оценено один раз. Если вы не выполните запрос миллион раз в минуту, разница не будет иметь значения.
ypercubeᵀᴹ
2
Полагаю, subdateчто потенциально более быстрое, по-вашему, как-то объясняется его "перегрузкой в ​​2 арности", но, пожалуйста, прости меня, если это глупый вопрос, что означают эти слова (в отношении функции )? В частности, что такое «2-арность»?
Андрей М
1
Кроме того, что касается формулировки вопроса, на curdate()самом деле может быть неправильный выбор, потому что ФП, казалось, хотел «вычесть 30 дней из текущей даты и времени » (выделено мной).
Андрей М
1
@AndriyM, Ну, так как этот поток получает 50 000 просмотров, я оставлю здесь ответ для людей, которые интересуются только компонентом времени. А что касается "арности", это относится к числу аргументов . Да, это верно, при всех равных условиях функция с двумя арностями потенциально быстрее, чем функция с тремя арностями. Это будет продолжаться, пока новая информация не будет добавлена ​​на табличку.
Пейсер