结合日期和时间字段的Postgres是有效的

时间:2017-09-25 18:19:11

标签: postgresql

我正在根据日期范围选择行,该日期范围使用下面的SQL来保存在字符串中,但这是一种有效的方法。如您所见,日期和时间保存在不同的字段中。一旦你在一个属性周围放置一个函数,就不能使用索引从我的记忆中或做Oracle工作。

select  *
from    events 
where   venue_id = '2'
and     EXTRACT(EPOCH FROM (start_date + start_time)) 
between EXTRACT(EPOCH FROM ('2017-09-01 00:00')::timestamp) 
and     EXTRACT(EPOCH FROM ('2017-09-30 00:00')::timestamp) 

那么有没有办法可以使用索引?

1 个答案:

答案 0 :(得分:1)

前言:由于您的查询仅限于一个venue_id,因此下面两个示例首先创建一个带venue_id的复合索引。

如果您需要用于改进 查询的索引,可以创建expression index

CREATE INDEX events_start_idx
ON events (venue_id, (EXTRACT(EPOCH FROM (start_date + start_time))));

如果您不想要专用函数索引,可以在start_date列上创建普通索引,并添加额外的逻辑来使用索引。然后索引将访问计划限制为日期范围,并且过滤掉第一个和最后一个日期错误时间的条纹记录。

在下文中,我也消除了不必要的时代提取。

CREATE INDEX events_venue_start
ON events (venue_id, start_date);
SELECT  *
FROM    events
WHERE   venue_id = '2'
AND     start_date BETWEEN '2017-09-01'::date AND '2017-09-30'::date
AND     start_date + start_time BETWEEN '2017-09-01 00:00'::timestamp
                                    AND '2017-09-30 00:00'::timestamp

WHERE子句的前两部分将使用索引来获得全部好处。最后一部分则使用过滤索引所找到的记录。