postgresql 在时间范围内搜索

Vla*_*ich 0 sql postgresql postgresql-9.3

所以这就是我想做的:

我有许多事件,每个事件代表一个日期时间范围(如 07.03.2014 06:00 - 07.03.2014 08:00)事件关联(一对多)到hall_schedule.

然后我想搜索所有hall_schedule's没有涵盖某个特定时间范围的事件的事件,例如:

“我想要所有大厅活动不涵盖 07.03.2014 06:00 - 07.03.2014 08:00 范围的 Hall_schedules”

那么问题来了,为了获得最好的性能,我该如何设计呢?存储事件并稍后进行所描述的搜索的最佳方式是什么?

我很高兴使用 postgresql (9.3) 特有的东西,无论什么都能提供最佳性能

poz*_*ozs 5

  1. 使用TIMESTAMP WITH TIME ZONEforhall_schedule和时间startend
  2. 用于tstzrange检测重叠,例如:

    SELECT *
      FROM "hall_schedule"
     WHERE NOT (tstzrange("start", "end", '[]') &&
                tstzrange(:input_start, :input_end, '[]'))
    
    Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果需要,您可以将整个范围存储在表tstzrange中的一列中,但从应用程序中进行编辑会比较困难(您必须在任何地方提供其文本表示形式)hall_schedule
  • 这样,如果您愿意,您实际上也可以创建EXCLUDE约束,以防止事件hall_schedule相互重叠。

更新:

此外,为了加快查询速度,您还可以添加以下索引:

CREATE INDEX "hall_schedule_range_idx"
          ON "hall_schedule"
       USING gist ((tstzrange("start", "end", '[]')));
Run Code Online (Sandbox Code Playgroud)