我希望获得11天前创建的所有paid_account
条记录。这就是我现在所拥有的:
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.
这样可行,但似乎必须有一种更简单的方法。还有更好的方法吗?
答案 0 :(得分:2)
您可以从current_date
中减去11,并将其与迄今投放的created_at
进行比较:
created_at::date = (current_date - 11)
答案 1 :(得分:1)
在标准SQL中,您可以从date类型的值或timestamp类型的值中减去interval类型的值。在这种情况下,PostgreSQL支持标准SQL。
由于名为" created_at"通常是时间戳,你可以这样做。
select *
from paid_account
where cast(created_at as date) = current_date - interval '11' day;
但是WHERE子句不是sargable。 (PostgreSQL特定的语法,因为created_at::date
也不是sargable。)如果你看一下执行计划,你会发现它总是使用顺序扫描。
在" created_at"上创建索引独自一人没有帮助。您需要表达式date(created_at)
上的索引才能获得良好的性能。
create index on paid_account (date(created_at));