【问题标题】:Rails 3 DateTime Comparison w/ Date In An ActiveRecord QueryRails 3 DateTime 比较与 ActiveRecord 查询中的日期
【发布时间】:2012-12-03 18:30:56
【问题描述】:

我正在尝试在模型中搜索与特定日期相等的任何日期,同时忽略时间戳。在 Rails 中,我可以简单地将其执行为 DateTime.to_date == somedate,但我认为在 SQL 中制定公式并不容易,因为我无法将 to_date 方法应用于像 created_at 这样的整个列:

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

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

【问题讨论】:

  • 你能做 created_at >= some_day_with_00:00:00 时间戳和 create_at
  • @Tad 显然我可以,感谢您的帮助。如果您将其发布为答案,我会接受。
  • 不客气 - 答案添加在下面

标签: ruby-on-rails-3 date datetime activerecord


【解决方案1】:

我会做类似...

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

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

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

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

所以

Foo.on_day( Date.yesterday ).count

可读性很好。

【讨论】:

  • 您有一个减一,这可能导致您每天计算两次。这是我的解决方法:where( :created_at => (someday)..(someday + 23.hours + 59.minutes + 59.seconds) )
【解决方案2】:

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 对象

【讨论】:

    【解决方案3】:

    范围:

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

    使用:

    Foo.on_day(Date.today).count
    

    【讨论】:

      【解决方案4】:

      试试created_at &gt;= some_day_with_00:00:00 timestamp and create_at &lt; some_day_plus_one_with_00:00:00 timestamp

      【讨论】:

        猜你喜欢
        • 2018-03-20
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 2016-03-28
        • 2016-11-12
        • 2012-11-20
        • 1970-01-01
        相关资源
        最近更新 更多