2010-08-05 346 views
1

我的web应用程序需要获取所有具有其时间值的项目的结果。我的表具有时间属性PostgreSQL查询当前分钟

id, message, time, ..., 

其中时间类型是带时区的时间戳。 我需要获取时间为当前分钟的所有条目的列表。比较整个值不匹配,因为时间戳具有微秒的分辨率。

目前我正在使用下面的查询来返回这个列表,它的工作原理,但我认为应该有一个更有效的方式来做到这一点。

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

感谢

回答

3

我想尝试这样的事:

WHERE 
    time >= date_trunc('minute', now()) AND 
    time < date_trunc('minute', now()) + INTERVAL '1 minute'; 

这将定义边界和范围,这意味着它仍然可以使用内搜索倍您在time列中拥有(或应该拥有)的索引。

+0

这正是我所期待的。我可以通过改变区间数量来检查最后n分钟。 谢谢... 有关这个问题的一个问题是Postgres足够聪明,以确定小时是否在周围环绕?假设在11:59有一个条目,那么在过去2分钟的12:00的查询会返回该结果吗?或者它只是使用分钟字段进行比较? – Inn0vative1 2010-08-06 15:46:56

+0

使用“INTERVAL”类型完成的任何操作都将足够智能,以正确计算时间/日历计算。 – 2010-08-06 15:53:33

2

简单比较截断的时间戳怎么样?

SELECT * 
    FROM notification n 
WHERE date_trunc('minute', n.time) = date_trunc('minute', current_timestamp); 

我怀疑优化是足够聪明的使用索引的使用这种方法虽然time列。如果你有这样的指数,那么你应该使用卢卡斯·拉林斯基的建议,如果你想要更好的表现。取决于你有多少数据。