MySQL Query - записи між сьогоднішнім та останнім 30 днями


122

Я хочу повернути всі записи, які були додані до бази даних протягом останніх 30 днів. Мені потрібно перетворити дату в mm / dd / yy через цілі відображення.

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

Моя заява не може обмежити записи останніми 30 днями - вона вибирає всі записи.

Чи може хтось вказати мені в правильному напрямку? Відчувається, що я поруч.

Дякую та чудовий тиждень.

Відповіді:


292

Вам потрібно застосувати 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 готує лише проблему. Знову вибачте.
ві

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

2
Я віддаю перевагу цей метод BETWEEN CurDate () - ІНТЕРВАЛ 30
Dan

1
@ErmSo я можу знати, чому?
струнка

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.