基于时间的分页

Pagination based on time

我有一个带有帖子的 PostgreSQL 数据库,我正在尝试为其实现分页。

table 看起来像这样:

postid | title | author | created 其中 created 的类型为 timestamp without timezone.

我的查询看起来像

SELECT * from posts 
WHERE extract(EPOCH FROM created) < :limit
ORDER BY created DESC
LIMIT 3

这里 :limit 是 java 中的一个 long,我将其作为参数传递。

但是,我总是检索相同的三个最新帖子,即使我的限制小于这三个帖子的时间戳。所以我猜 extract(EPOCH FROM created) 部分是错误的,但我不知道如何修复它。

您的代码看起来不错,应该可以满足您的要求,前提是 :limit 确实如您所想。

但是,我建议将转换移动到正确的操作数,而不是将存储值转换为纪元。这样效率更高,并且可以利用时间戳列上的索引:

SELECT * 
from posts 
WHERE created < date'1970-01-01' + :limit * interval '1 second'
ORDER BY created DESC
LIMIT 3

或:

WHERE created < to_timestamp(:limit::bigint)

一个可能的问题是 :limit 是以毫秒而不是秒为单位给出的。如果是:

WHERE created < to_timestamp((:limit/1000)::bigint)