Запрос MySQL - записи между сегодняшним днем ​​и за последние 30 дней

122

Я хочу вернуть все записи, которые были добавлены в базу данных за последние 30 дней. Мне нужно преобразовать дату в мм / дд / гг из-за целей отображения.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Моя инструкция не ограничивает записи последними 30 днями - она ​​выбирает все записи.

Может кто-то указать мне верное направление? Такое ощущение, что я рядом.

Спасибо и удачной вам недели.

Джейсон Свит
источник

Ответы:

294

Применять нужно DATE_FORMATв SELECTпредложении, а не в WHEREпредложении:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Также обратите внимание, что CURDATE()возвращается только DATEчасть даты, поэтому, если вы сохраняете create_dateкак DATETIMEс заполненной частью времени, этот запрос не будет выбирать сегодняшние записи.

В этом случае вам нужно будет использовать NOWвместо этого:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
источник
Вторая часть этого ответа очень важна! У меня могла быть или не быть этой проблемы, и я чесал голову, пока не вернулся к этому ответу.
Тайлер Лазенби
@Quassnoi Мне очень жаль. Кажется, это только проблема подготовки WordPress \ wpdb. Прости еще раз.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
источник
2
Я предпочитаю этот метод МЕЖДУ CURDATE () - ИНТЕРВАЛ 30
Дэн
1
@Erm Так я могу знать почему?
slim
3
Не буду врать - это было 2 года назад, и я не могу вспомнить! Извините: P
Dan
1
Не нужно использоватьDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@Dan Я предпочитаю сделать его более читабельным, заключив предыдущую дату в круглые скобки: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Крис Крейг,
10

DATE_FORMATвозвращает строку, поэтому вы используете две строки в своем BETWEENпредложении, что не будет работать так, как вы ожидаете.

Вместо этого преобразуйте дату в свой формат в SELECTи выполните BETWEENдля фактических дат. Например,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Рич Адамс
источник
9

Вы также можете написать это в mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

ФИКСИРОВАННЫЙ

Рохит Сутар
источник
2
Осторожно: несмотря на голоса за, при этом выбираются даты в следующие 30 дней / месяц, а не в последние 30 дней!
JonBrave
4
Согласовано, должно быть WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH);
Бхавик П.
6

Для активности на текущую дату и для полной активности за предыдущие 30 дней используйте это, поскольку SYSDATE является переменным в день, в предыдущий 30-й день не будет всех данных за этот день.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
onlybymyexerperience
источник
1

Вот решение без использования curdate()функции, это решение для тех, кто использует, TSQLя думаю

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
источник