2014-03-13 149 views
2

我想獲取11天前剛剛創建的所有paid_account記錄。這是我現在有:查找X天前創建的記錄

SELECT * 
    FROM paid_account 
WHERE date_trunc('day', created_at) = date_trunc('day', date ?) 

-- The ? gets replaced with today's date in the user's timezone. 

這樣的作品,但它似乎必須有一個更簡單的方法來做到這一點。有沒有更好的辦法?

+1

怎麼樣'created_at :: date =(current_date - 11)'? –

+0

工作。如果你把這個作爲答案,我會接受它。 –

回答

1

您可以從current_date 11。減去並將其與created_at鑄造迄今爲止比較:

created_at::date = (current_date - 11) 
1

在標準SQL中,你會無論是從日期類型值或值減去型區間值鍵入時間戳。在這種情況下,PostgreSQL支持標準SQL。

由於名爲「created_at」的列通常是時間戳,因此可以這樣做。

select * 
from paid_account 
where cast(created_at as date) = current_date - interval '11' day; 

但是WHERE子句不是可靠的。 (特定於PostgreSQL的語法,因爲created_at::date也不是可選的。)如果你看執行計劃,你會發現它總是使用順序掃描。

單獨在「created_at」上創建索引不會有幫助。您需要使用表達式date(created_at)上的索引才能獲得良好的性能。

create index on paid_account (date(created_at));