2013-10-04 158 views
0

我想執行這個簡單的查詢:如何使用postgresql將時間間隔轉換爲時間戳?

SELECT 
    pid, 
    MIN(interval '5 minutes' - current_timestamp - state_change) 
FROM 
    pg_stat_activity 
AND 
    current_timestamp - state_change <= interval '5 minutes' 
GROUP BY 
    pid 
ORDER BY 
    2 ASC 
LIMIT 1; 

但PG抱怨有intervaltimestamp with time zone之間沒有操作。

如何將我的間隔轉換爲時間戳?

+0

那麼你有什麼期望從「5分鐘減去時間戳」的結果?另一種方式是有意義的:「時間戳減去5分鐘」。所以我想你想要:'MIN(current_timestamp - state_change - interval'5'minutes)' –

回答

3

不可能的轉換不是問題,這是評估順序的問題。在不改變參數的順序您可以將其用括號寫:

interval '5 minutes' - (current_timestamp - state_change) 

,它會工作,因爲interval - interval支持。如果沒有括號,它將不起作用,因爲interval - timestamp將首先被評估並且未實現。

一點題外話,因爲pidpg_stat_activity獨特的GROUP BY pidMIN應該被抑制,如:

SELECT 
    pid, 
    interval '5 minutes' - (current_timestamp - state_change) 
FROM 
    pg_stat_activity 
WHERE 
    current_timestamp - state_change <= interval '5 minutes' 
+0

我需要'MIN'因爲我正在尋找最低的差異。 – Stephan

+0

@Alex:我的觀點是,每個'pid'只有一個'state_change',所以通過pid和應用'min()'進行分組就是要求在一個值的列表中的最小值,並且只是等於這個值。 –

+0

在我的問題中檢查我的更新 – Stephan

相關問題