Як відняти 30 днів від поточного часу в mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Як відняти 30 днів від поточного часу в 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/uk/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()функцію, оскільки вона вбиває кешування.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
Ви можете використовувати, BETWEENякщо ви дійсно хочете речі з цієї самої секунди до 30 днів до цієї самої секунди, але це не є загальним випадком використання на моєму досвіді, тому я сподіваюся, що спрощений запит може служити вам добре.
NOW()і все одно використовувати це у своїй відповіді. o_O PS: ваш запит поверне інший результат, а не те, що, напевно, хоче OP
BETWEENі >=це різні оператори, ви знаєте? Мій запит обмежує встановлений результат для 30 days ago AND todayцього everything after 30 days ago. Тож tomorrowзаписи не збігаються з моїм та вашим оригінальним запитом, але відповідатимуть за цією відповіддю
Зниження днів 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
Ви також можете використовувати
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Ви можете форматувати, використовуючи формат дати в SQL.
Якщо вам потрібна лише дата, а не час використання:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
Оскільки curdate()пропускає компонент часу, це потенційно швидше now()і «семантично правильніше» у випадках, коли вас цікавить лише дата.
Крім того, subdate()перевантаження з двома аритами може бути швидше, ніж використання interval.
intervalпризначений для випадків, коли вам потрібен не денний компонент.
subdate(curdate(), 30)це швидше CURRENT_DATE - INTERVAL 30 DAY? У вас є докази? І як швидко це було б? Кілька мікросекунд?
subdate, що потенційно швидше це, мабуть, якось пояснюється, на вашу думку, його "перевантаженням із 2-ма рівнями", але, будь ласка, пробачте мене, якщо це дурне питання, що означають ці слова (стосовно функції )? Зокрема, що таке "2-арти"?
curdate()самому ділі може бути неправильний вибір, тому що ОП , здавалося, хотів «відняти 30 днів від поточної дати - часу » (курсив мій).