选择Postgres中日期范围内的记录

时间:2016-01-25 22:56:15

标签: ruby-on-rails postgresql activerecord

给定concerts表和concerts.occurence_datesArray列。 我需要使用ActiveRecord选择from_dateto_date内的音乐会。

我刚刚想出如何在from_date之后选择事件:

Concert.where(':from_date < ANY(occurrence_dates)', from_date: from_date)

2 个答案:

答案 0 :(得分:0)

作为mentioned in the official documentation

  

数组不是集合;搜索特定的数组元素可能是数据库错误设计的标志。考虑为每个将成为数组元素的项使用一个单独的表。这将更容易搜索,并且可能更好地扩展到大量元素。

这也适用于您的情况,尝试使用特定的数组元素执行搜索。

您使用的字段错误。您真正需要使用的是两个单独的列,一个用于to_date,另一个用于Concert.where('from_date >= ? AND to_date <= ?', from_date, to_date) ,还有两个索引。

索引将确保快速查找,单独的列将允许您搜索传递一系列日期或仅使用

occurrence_dates

使用当前设置,您的最佳解决方案是扫描所有记录,选择每个[weak self]并检查它们是否符合您的条件。

答案 1 :(得分:0)

可能的解决方案:

Concert.where('(occurrence_dates[0], occurrence_dates[array_length(occurrence_dates, 1)]) OVERLAPS (:from_date, :to_date)', from_date: from_date, to_date: to_date)