Запрос 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 Мне очень жаль. Кажется, это только проблема подготовки WordPress \ wpdb. Прости еще раз.
vee

56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();

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()

1

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

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.