2010-08-05 344 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列。如果你有這樣的指數,那麼你應該使用盧卡斯·拉林斯基的建議,如果你想要更好的表現。取決於你有多少數據。