Rails ActiveRecord - 按日期选择所有对象,仅使用日、月、年,但忽略日期的其余部分

问题描述 投票:0回答:2

我有一个名为

Event
的模型。我希望能够获取在某个特定日期创建的所有事件,应该是这样的

Event.where(created_at: "20/01/2019".to_date)

问题是

created_at
字段还包含分钟、秒等,我想忽略它们。我只想按日、月、年比较日期。有什么办法可以实现这个目标吗?

ruby-on-rails activerecord
2个回答
2
投票

您可以使用

Date#beginning_of_day
Date.end_of_day
两者均由
ActiveSupport
核心扩展提供。

d = '2019-01-20'.to_date 
Event.where(created_at:(d.beginning_of_day..d.end_of_day))

这不一定会比较“...日期、月份和年份”。相反,它会创建一个包含一整天的 Between 子句。如果您想使用

Hash
查找器语法,这可能是最好的方法。

你可以和

一起去
Event.where(
  Arel::Nodes::NamedFunction.new('CAST',
     [Event.arel_table[:created_at].as('DATE')]
  ).eq(d)
)

如果您真的只想比较日、月和年。

选项 1 将导致

 events.created_at BETWEEN '2019-01-20 00:00:00' AND '2019-01-20 23:59:59'

选项 2 将导致

 CAST(events.created_at AS DATE) = '2019-01-20'

0
投票
Event.where(created_at: d.to_time.all_day)
© www.soinside.com 2019 - 2024. All rights reserved.