MySQL Query - записи между сегодняшним и последним 30 днями - PullRequest
108 голосов
/ 11 января 2010

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

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

Мое утверждение не может ограничить записи за последние 30 дней - оно выбирает все записи.

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

Спасибо и хорошей недели.

Ответы [ 6 ]

250 голосов
/ 11 января 2010

Вам необходимо применить 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()
52 голосов
/ 02 февраля 2010
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
10 голосов
/ 11 января 2010

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 голосов
/ 25 июня 2014

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

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL +1 MONTH);
6 голосов
/ 03 декабря 2011

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

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
1 голос
/ 08 марта 2018

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

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...