基于时间的分页
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)
我有一个带有帖子的 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)