Как вы находите результаты, которые произошли на прошлой неделе? - PullRequest
40 голосов
/ 04 января 2012

У меня есть таблица books со столбцом returned_date.Я хотел бы видеть результаты для всех книг с возвращенной датой, которая произошла на прошлой неделе.

Есть мысли?Я пытался сделать какую-то математику, но Постгрес не был доволен моей попыткой.

Ответы [ 3 ]

63 голосов
/ 04 января 2012

Вы хотите использовать interval и current_date:

select * from books where returned_date > current_date - interval '7 days'

Это вернет данные за прошедшую неделю , включая сегодня.

Подробнее о работе с датами в Postgres .

40 голосов
/ 05 января 2012

Предполагая, что 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.

0 голосов
/ 04 января 2012

Какую математику вы пробовали?

Это должно работать

select * from books where current_date - integer '7'

Взято из PostgreSQL Дата / Время Функции и операторы

...