Postgres选择相隔2小时插入的记录

时间:2018-04-11 11:39:30

标签: sql postgresql

我正在处理此查询并尝试选择在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;

修改

道歉,因为我的问题不清楚,我上面的查询之所以复杂,是因为我试图“聚集”我的记录。基本上我正在尝试获取相同类别的记录,这些记录发布在2小时时间范围内由不同用户发布的相同位置(相同的cityID)。

因此,当查询在21:00执行时,它应该返回来自同一位置的记录,该记录在同一类别上发布,同时“大致”发布。当我说“粗略”时,它基本上是试图获得在过去2小时内发布的帖子。

1 个答案:

答案 0 :(得分:1)

  

当查询执行时间为21:15:00时,查询应该记录在执行查询的最后2小时内发生的记录。

你的查询似乎太复杂了。

也许我对你为什么不使用它感到困惑?

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;

我认为将来无法创建帖子。如果您插入当前时间,则情况并非如此。