Postgres выбирает записи, вставленные с интервалом в 2 часа

Я работаю над этим запросом и пытаюсь выбрать все записи, которые вставляются с интервалом в x часов.

Например, у меня есть следующая запись

A      2018-04-11 18:00:00
B      2018-04-11 19:00:00
C      2018-04-11 20:00:00
D      2018-04-11 21:00:00

Когда запрос выполняется, время 21:15:00, запрос должен принимать записи, которые произошли в течение последних 2 часов с момента выполнения запроса. Итак, в этом случае он должен вернуться:

21:00:00 и 20:00:00

Это запрос, над которым я работаю, и он работает не так, как ожидалось, потому что он показывает только 2 записи, даже если их больше 2.

SELECT *
    FROM posts p1
    WHERE p1.created_at >= '2018-04-11 16:00:00'
    AND exists
    (
        SELECT p2.id
        FROM posts p2
        WHERE p2.created_at <= '2018-04-11 17:00:00'
        AND p2.created_at > p1.created_at
        AND p2.created_at - p1.created_at < INTERVAL '1 HOUR'
        AND p2.category_id = p1.category_id
        AND p2.city_id = p1.city_id
        AND p2.district_id = p1.district_id
        AND p2.subcategory_id = p1.subcategory_id
    )
    AND p1.category_id = 3;

РЕДАКТИРОВАТЬ

Приносим извинения за непонятность моего вопроса. Причина, по которой мой запрос выше сложен, потому что я пытаюсь «кластеризовать» свою запись. В основном я пытаюсь получить записи одной и той же категории, которые размещены в одном месте (с одним и тем же cityID), которые публикуются разными пользователями в течение 2 часов.

Таким образом, когда запрос выполняется в 21:00, он должен возвращать записи, поступающие из того же места, размещенные в той же категории, которые были опубликованы «примерно» в одно и то же время. Когда я говорю «примерно», это в основном попытка получить сообщение, опубликованное в течение последних 2 часов.

0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

When the query is executed the time is 21:15:00, the query should take records that are occurred within the last 2 hours from the query is executed.

Ваш запрос кажется слишком сложным.

Возможно, меня смущает, почему бы вам просто не использовать это?

select p.*
from posts p
where p.created_at >= current_timestamp - interval '2 hour';

Если вы собираетесь ввести свои собственные значения, вам, вероятно, понадобятся:

select p.*
from posts p
where p.created_at >= '2018-04-11 16:00:00'::timestamp - interval '2 hour' and
      p.created_at < '2018-04-11 16:00:00'::timestamp;

Я предполагаю, что посты не могут быть созданы в будущем. Это неверно, если вы подключаетесь к текущему времени.

Спасибо за помощь Гордону, но ваш запрос возвращает следующую ошибку: [22007] ОШИБКА: недопустимый синтаксис ввода для интервала типа: «2018-04-11 16:00:00» Позиция: 47

Jeremy 11.04.2018 13:50

@ Джереми Откуда взялся 2018-04-11 16:00:00? Это недопустимое значение интервала. Может быть, вы хотели заменить current_timestamp на это значение?

404 11.04.2018 14:03

@Gordon, я заменяю current_timestamp значением, которое я ввожу сам для целей отладки / тестирования.

Jeremy 11.04.2018 14:22

Привет @Gordon, мне удалось избавиться от ошибки с недопустимым синтаксисом ввода. Однако он возвращает данные, которые не соответствуют ожиданиям.

Jeremy 11.04.2018 14:30

@Jeremy Я помогу, если вы обновите вопрос новым SQL и получите результат

igr 11.04.2018 14:53

Привет, @Gordon, спасибо за помощь и редактирование вашего запроса, но, возможно, я не совсем понимаю свой вопрос. Пожалуйста, посмотрите мою правку.

Jeremy 11.04.2018 15:57

привет @igr да, я только что обновил свой вопрос. Пожалуйста, посмотрите мое редактирование

Jeremy 11.04.2018 16:01

Другие вопросы по теме