我的网络应用程序需要获取所有具有本分钟时间价值的项目的结果。我的表有时间属性
id, message, time, ...,
其中time是带时区的timestamp类型。 我需要获得所有条目的列表,其中时间是当前分钟。比较整个值不匹配,因为时间戳具有微秒分辨率。
目前我使用以下查询返回此列表并且它可以正常工作,但我认为应该有一种更有效的方法。
SELECT * FROM notification WHERE
date_part('year', time) = date_part('year', current_date) AND
date_part('month', time) = date_part('month', current_date) AND
date_part('day', time) = date_part('day', current_date) AND
date_part('hour', time) = date_part('hour', current_time) AND
date_part('minute', time) = date_part('minute', current_time);
我也想知道如何获得这个和前一分钟或最后'n'分钟的结果。 数据库是PostgreSQL 8.4.3
由于
答案 0 :(得分:3)
我会尝试这样的事情:
WHERE
time >= date_trunc('minute', now()) AND
time < date_trunc('minute', now()) + INTERVAL '1 minute';
这将定义边界并搜索该范围内的时间,这意味着它仍然可以使用time
列上您(或应该拥有)的索引。
答案 1 :(得分:2)
如何简单地比较截断的时间戳?
SELECT *
FROM notification n
WHERE date_trunc('minute', n.time) = date_trunc('minute', current_timestamp);
我怀疑优化器是否足够聪明,可以使用这种方法在time
列上使用索引。如果你有这样的索引,那么你应该使用LukášLalinský的建议,如果你想要更好的表现。取决于你有多少数据。