8

我正在尝试在模型中搜索等于特定日期的任何日期,同时忽略时间戳。在 Rails 中,我可以简单地将其执行DateTime.to_date == somedate

Foo.where("created_at == some_day_without_time_stamp").count

最初我认为因为我使用的是 postgresql 数据库,所以我可以简单地使用 psql 语法,但我更愿意将它留给 ActiveRecord 来决定哪种 sql 最适用,并使我的代码与数据库供应商无关。如果没有任何额外的插件或宝石,这可能吗?

4

4 回答 4

11

我会做类似...

someday = Date.today
Foo.where( :created_at => (someday)..(someday + 1.day) )

这将捕获午夜和created_at之间的所有日期。这是包容性的(因此它将包括在 +1 天午夜创建的 Foo 爆炸),但可能对您的需求“足够好”而不会弄乱时间戳。somedaysomeday + 1

为了好看,我会把它包装成一个scope

scope :on_day, ( lambda do |someday|
  where( :created_at => (someday)..(someday + 1.day) )
end )

所以

Foo.on_day( Date.yesterday ).count

可读性很好。

于 2012-12-04T10:26:59.553 回答
9

DateTime 类有两个有用的方法来做到这一点:beginning_of_dayend_of_day.

对于这种情况,您有一个 Date 对象,您可以这样做:

Foo.where('created_at >= #{Date.today.to_time.beginning_of_day} AND 
           created_at <= #{Date.today.to_time.end_of_day}')

请注意,您必须将 Date 对象转换为 DateTime 对象

于 2014-04-02T07:42:17.297 回答
7

有范围:

scope :on_day, (lambda do |day|
   where(date: day.beginning_of_day..day.end_of_day)
end)

使用:

Foo.on_day(Date.today).count
于 2014-11-10T05:05:53.047 回答
3

尝试created_at >= some_day_with_00:00:00 timestamp and create_at < some_day_plus_one_with_00:00:00 timestamp

于 2012-12-03T18:52:52.353 回答