Получить строки в течение последних 30 дней, исключая сегодня

-1

30-дневный перерыв с Postgres 9.2.

У меня есть такая таблица:

ID NAME CREATED_AT

1 valid 2019-03-07 12:00:00
2 valid 2019-02-05 12:00:00
3 valid 2019-02-04 12:00:00

Я хочу получить все строки, которые соответствуют 30-дневному интервалу до сегодняшнего дня.

Если сегодня 2019-03-07 я должен получить только:

2 valid 2019-02-05 12:00:00

Если сегодня 2019-04-06 я должен получить:

1 valid 2019-03-07 12:00:00
2 valid 2019-02-05 12:00:00

и так далее...

Если сегодня 2019-05-06:

1 valid 2019-03-07 12:00:00
2 valid 2019-02-05 12:00:00
Теги:
intervals
date-arithmetic

2 ответа

1

В Postgres вы можете просто вычесть integer (как количество дней) из date:

SELECT *
FROM   tbl
WHERE  created_at >= current_date - 30
AND    created_at <  current_date;  -- to exclude "today" (and the future)

date приведена к timestamp неявно в выражении.

Исключая "сегодня", это составляет 30 дней. Если таблица большая, рассмотрите индекс на (created_at).

  • 0
    Это не работает, потому что я должен получать результаты только с интервалом в 30 дней. Предположим, у меня есть сценарий, который должен выполняться каждые 30 дней, как подписка, в основном каждые 30 дней с начала. Так 30 дней 60 дней и т. Д.
  • 0
    Обновлено в соответствии с вашим обновленным определением границ.
Показать ещё 3 комментария
0

Это сработало для меня...

select (NOW() - interval '30 day')

Функция NOW() вернет текущую дату.

Тип данных INTERVAL позволяет хранить периоды времени и управлять ими в годах, месяцах, днях, часах, минутах, секундах и т.д. Интервал требует 16-байтового хранилища.

@ interval [ fields ] [ (p) ]

Интервал имеет необязательное значение точности p. р имеет диапазон от 0 до 6 и доли цифр в секундах. Знак @не является обязательным.

SELECT * FROM TABLE 
WHERE CREATED_AT >= (NOW() - interval '30 day')
AND CREATED_AT <= (NOW() - interval '1 day');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню