Як відняти 30 днів від поточного часу в mysql?


197

Як відняти 30 днів від поточного часу в mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

Відповіді:



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 Як цей запит дасть інший набір результатів, ніж ваш запит?
користувач784637

2
@ user784637: uhm, 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/uk/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 


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 ;

0

Якщо вам потрібна лише дата, а не час використання:

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

Оскільки curdate()пропускає компонент часу, це потенційно швидше now()і «семантично правильніше» у випадках, коли вас цікавить лише дата.

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


11
Отже, ти стверджуєш, що subdate(curdate(), 30)це швидше CURRENT_DATE - INTERVAL 30 DAY? У вас є докази? І як швидко це було б? Кілька мікросекунд?
ypercubeᵀᴹ

2
Я поняття не маю. Я, звичайно, не можу підтримати власні коментарі. Щодо "потенційно" більш швидкої претензії я все ще не бачу жодних доказів, вирішальних чи побічних. І навіть якщо це дещо швидше, стан оцінювали б один раз. Якщо ви не виконаєте запит мільйон разів на хвилину, різниця не матиме значення.
ypercubeᵀᴹ

2
Я здогадуюсь subdate, що потенційно швидше це, мабуть, якось пояснюється, на вашу думку, його "перевантаженням із 2-ма рівнями", але, будь ласка, пробачте мене, якщо це дурне питання, що означають ці слова (стосовно функції )? Зокрема, що таке "2-арти"?
Андрій М

1
Крім того , наскільки формулювання питання, на curdate()самому ділі може бути неправильний вибір, тому що ОП , здавалося, хотів «відняти 30 днів від поточної дати - часу » (курсив мій).
Андрій М

1
@AndriyM, Отже, оскільки ця тема набирає 50k переглядів, я залишу тут відповідь людям, які цікавляться лише часовою складовою. Що стосується "арності", то тут йдеться про низку аргументів . Так, це правильно. При рівних ситуаціях функція 2-х арійності потенційно швидша, ніж функція 3-х арійностей. Це буде справедливо, поки нова інформація не буде додана до таблички.
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.