【问题标题】:How do you filter records by the time of day in Rails?你如何在 Rails 中按时间过滤记录?
【发布时间】:2014-04-05 04:51:13
【问题描述】:

我有一堆记录,其中存储了 DateTime,仅用于提取一天中的时间(即下午 6:00),我想按一天中的时间过滤它们。例如,我想获取一天中时间在上午 10:00 到下午 2:00 之间的所有记录,而不管时间戳是针对哪一天的。

有没有办法在 Rails 中做到这一点?我意识到DateTime 可能不是存储这些数据的最简单/最好的方法,所以我愿意改变它。另外,我正在使用 Postgres。

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

    使用 Postgres,您可以使用类型转换将日期时间/时间戳字段转换为时间,例如:

    select * from posts where created_at::time BETWEEN '10:00:00' and '14:00:00';
    

    所以,在 Rails 中,您应该能够做到:

    Post.where('start_at::time BETWEEN ? AND ?', '10:00:00', '14:00:00')
    

    而且 Postgres 足够聪明,可以理解 AM/PM 格式:

    Post.where('start_at::time BETWEEN ? AND ?', '10:00:00 AM', '02:00:00 PM')
    

    【讨论】:

      【解决方案2】:

      如果您使用的是作为 Rails 模型生成器的一部分生成的标准时间戳,那么您将使用 DateTime 来生成这些时间戳。

      假设这是 created_at 模型属性(不一定是,将其更改为您正在使用的值),以下是操作方法:

      在原始 SQL 中,您要查找的查询是 SELECT * FROM TABLE WHERE created_at BETWEEN FIRST_DATE AND SECOND_DATE;,它在 Rails 中可以表示为:

      @first_date  = DateTime.new(now.year, now.month, now.day, 10, 0, 0, 0)
      @second_date = DateTime.new(now.year, now.month, now.day, 14, 0, 0, 0)
      
      Model.where(created_at: @first_date..@second_date)
      

      ..(它是一个序列运算符)告诉 Rails 使用 @first_date@second_date 作为原始 SQL 查询中的 FIRST_DATESECOND_DATE 值来构建 BETWEEN 查询。

      【讨论】:

      • 您错过了问题的“无论时间戳是哪一天”部分。
      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 2019-03-10
      相关资源
      最近更新 更多