Ruby on rails 如何在rails(postgres)查询中参数化日期范围?
正如标题所问,如何在查询中包含日期范围 例如,假设我有一个名为VisitToGrandma的模型,它有一个名为visit_date的字段。现在,我想找到上个月所有拜访祖母的经历 以下是我正在尝试的:Ruby on rails 如何在rails(postgres)查询中参数化日期范围?,ruby-on-rails,postgresql,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Postgresql,Ruby On Rails 5,Rails Activerecord,正如标题所问,如何在查询中包含日期范围 例如,假设我有一个名为VisitToGrandma的模型,它有一个名为visit_date的字段。现在,我想找到上个月所有拜访祖母的经历 以下是我正在尝试的: VisitToGrandma.where("? @> visit_date", (1.month.ago..Time.now)) 但是,这将生成以下查询: “2018-07-07-01”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-02”、“201
VisitToGrandma.where("? @> visit_date", (1.month.ago..Time.now))
但是,这将生成以下查询:
“2018-07-07-01”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-03”、“2018-07-07-03”、“2018-07-07-03”、“2018-07-07-04”、“2018-07-07-05”、“2018-07-07-06”、“2018-07-07-07-07-08”、“2018-07-07-07-09”、“2018-07-07-07-10”、“2018-07-07-11”、“2018-07-7-11”、“2018-2018-07-07-7-7-7,”2018-7,”2018-07-7-7-7,”2018-11,”2018-2018-07-07-7,”2018-7,”2018-7-7-7-7,”2018-7,”2018-7-7-7 11,”2018-7,”2018-7,”2018-07-07-7,”2018-7,”2018-7-7-7,”2018,”2018-7-7-7 11,”2018-7 7 2018年7月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”访问日期
正确的参数化方法是什么
是的,我知道对于这个虚构的例子,我可以只使用开始日期和结束日期,使用BETWEEN或其他操作符,而不使用实际的日期范围,但这不是我要问的
编辑以指出此问题与以下问题的不同之处:
这个问题只是关于在一个范围内查找一个日期,我的问题是如何实际参数化一个范围对象,以便可以使用postgresql的所有daterange运算符。似乎您需要滥用一点where占位符来用ActiveRecord实现这一点
VisitToGrandma.where(
":range::daterange @> date",
range: '[2011-01-01,2011-03-01)'
)
注意符号[在范围内,更多关于Postgres doc的信息
似乎您需要滥用一些where占位符来使用ActiveRecord实现这一点
VisitToGrandma.where(
":range::daterange @> date",
range: '[2011-01-01,2011-03-01)'
)
注意符号[在范围内,更多关于Postgres doc的信息
正如我最近在另一个回答中提到的,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)
)
正如我最近在另一个回答中提到的,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)
)
可能是@jvillian的重复,是的,它们是非常相似的问题,但那一个的上下文是没有结果出现,而我的上下文是它正在生成一个错误的查询。”\_ツ_/“认识到上下文的差异,这种方法是否适用?”VisitToGrandma.wherevisit_date:1.月.前..时间.现在?@jvillian,对于这个虚构的例子,是的,但我需要知道如何包含日期范围,以便使用postgresql的所有日期范围运算符,而不仅仅是查找日期是否在这个范围内,我为我的混淆道歉,但你知道吗是指当字段类型为postgres daterange时?可能是@jvillian的重复,是的,它们是非常相似的问题,但该问题的上下文是没有结果出现,而我的上下文是它正在生成错误的查询。'\_ツ_/“认识到上下文的差异,这种方法是否适用?”VisitToGrandma.wherevisit_date:1.月.前..时间.现在?@jvillian,对于这个虚构的例子,是的,但我需要知道如何包含日期范围,以便使用postgresql的所有日期范围运算符,而不仅仅是查找日期是否在这个范围内,我为我的混淆道歉,但你知道吗当字段类型为postgres daterange时是什么意思?当daterange可用并且我们正在处理日期时,为什么要使用tsrange?您可以使用connection.type_cast以适当的格式生成字符串,type_cast还可以正确区分..和..范围。您是对的@muistooshort,daterange是比较da的正确运算符tes,不是时间戳。我会更新我的答案的。谢谢。你介意发布另一个答案和你的建议吗?我想我现有的答案已经足够好了,但请随意更新你的答案。当daterange可用并且我们正在处理日期时,为什么要使用tsrange?你可以使用connection.type\u cast以适当的格式生成字符串,键入_cast还正确区分了..和..范围。你是对的@muistooshort,daterange是比较日期而不是时间戳的正确操作符。我会更新我的答案的。谢谢。你介意发布另一个答案和你的建议吗?我想我现有的答案已经足够好了,但请随时更新你的答案。使用连接n、 你的演员让它很开心。谢谢。 :使用connection.type_cast使它很高兴。谢谢