2014-03-13 107 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));