ruby-on-rails - 如何在 rails (postgres) 查询中参数化日期范围?

标签 ruby-on-rails postgresql ruby-on-rails-5 rails-activerecord

正如标题所问,如何在查询中包含日期范围?

例如,假设我有一个名为 VisitToGrandma 的模型,它有一个名为 visit_date 的字段。现在,我想查找上个月所有拜访祖母的情况。

这是我正在尝试的:

VisitToGrandma.where("? @> visit_date", (1.month.ago..Time.now))

但是,这会产生查询:

SELECT "visits_to_grandmas".* FROM "visits_to_grandmas" WHERE ('2018-07-01','2018-07-02','2018-07-03','2018-07-04','2018-07-05','2018-07-06','2018-07-07','2018-07-08','2018-07-09','2018-07-10','2018-07-11','2018-07-12','2018-07-13','2018-07-14','2018-07-15','2018-07-16','2018-07-17','2018-07-18','2018-07-19','2018-07-20','2018-07-21','2018-07-22','2018-07-23','2018-07-24','2018-07-25','2018-07-26','2018-07-27','2018-07-28','2018-07-29','2018-07-30','2018-07-31','2018-08-01' @> visit_date)

参数化的正确方法是什么?

是的,我知道对于这个虚构的示例,我可以只使用开始日期和结束日期并使用 BETWEEN 或其他一些运算符来执行此操作,而无需使用实际日期范围,但那是不是我要问的。

编辑以指出这个问题与 the other question 有何不同:

这个问题只是关于在一个范围内找到一个日期,我的问题是询问如何实际参数化一个范围对象,以便可以使用所有 postgresql 的 daterange 运算符。

最佳答案

正如我最近在另一个 PostgreSQL/range/ActiveRecord 中提到的答案是,AR 与 PostgreSQL 范围类型的集成是有限的。

您可以通过半手动生成所需范围的字符串表示来解决这个问题:

ActiveRecord::Base.connection.type_cast(1.month.ago.to_date .. Time.now.to_date)

不是 #to_date 调用来获取日期而不是时间戳。你也可以说:

today = Date.today
ActiveRecord::Base.connection.type_cast(today.months_ago(1) .. today)

将其与您的查询混合:

today = Date.today
VisitToGrandma.where(
  '? @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)

根据上下文,您可能更容易/更清晰地访问连接。您可能希望包含类型转换以确保没有任何内容被误解:

today = Date.today
VisitToGrandma.where(
  '?::daterange @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)

关于ruby-on-rails - 如何在 rails (postgres) 查询中参数化日期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641498/

相关文章:

sql - 按值对进行 ActiveRecord 查询

php - 应用程序服务器从哪里开始

css - 无法访问 Zurb Foundation 全局变量

java - 在 Equinox 中配置 PostgreSQL 数据源时的 NPE

ruby-on-rails - 使用简单形式的 gem f.association 为新操作提供 NoMethodError

ruby-on-rails - 如何将 2 个 Rails 5 应用程序连接在一起 API(Rails)和前端(Rails 以及)

ruby-on-rails - Rails 由最后一个分隔符分割

ruby-on-rails - 从 Rails 上的 base64 编码图像中检索文件名和内容类型

postgresql - 如何使用 PostgreSQL JSONB_SET() 创建新的深层对象元素

sql - 在 postgreSQL 中索引和查询高维数据