Предполагая, что returned_date
на самом деле является типом данных date
, это проще, быстрее и правильнее:
SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7
now()::date
- реализация Postgres стандартного SQL CURRENT_DATE
. Оба делают то же самое в PostgreSQL.
CURRENT_DATE - 7
работает, потому что можно вычесть / сложить integer
значений (= дней) из / в date
. Число без кавычек, такое как 7
, представляет собой числовой литерал со значением по умолчанию integer
, в то время как оно содержит только цифры и необязательный начальный знак, поэтому явное приведение не требуется.
С типом данных timestamp
или timestamptz
вы должны добавить / вычесть interval
, как показывает @Eric. Вы можете сделать то же самое с date
, но в результате получите timestamp
, и вам придется вернуться к date
или продолжить работу с timestamp
. Придерживаться date
, как показано, - самый простой и быстрый способ. Разница в производительности, как правило, небольшая.
Вычисление не зависит от фактического типа данных returned_date
, результирующий тип справа от оператора будет приведен в соответствие в любом случае (и выдаст ошибку, если преобразование не зарегистрировано).
Для " прошедшей недели ":
- К включите сегодня сделайте его
> current_date - 7
или >= current_date - 6
.
К исключить сегодня сделать его BETWEEN current_date - 7 AND current_date - 1
(или аналогичным). >= current_date - 7
, как предлагают другие ответы, возвращает строки за последние 8 дней вместо 7 и, строго говоря, неверно.
Чтобы получить последнюю полную календарную неделю, заканчивающуюся воскресеньем, исключая сегодня:
BETWEEN date_trunc('week', now())::date - 7 AND date_trunc('week', now())::date - 1
Обратите внимание, что точное определение "дня" и "недели" всегда зависит от текущей настройки timezone
.