【问题标题】:How can I find records from today, yesterday and so on with Ruby on Rails?如何使用 Ruby on Rails 查找今天、昨天等的记录?
【发布时间】:2011-04-03 23:59:42
【问题描述】:

我想查找今天使用 Ruby on Rails 创建的所有记录,例如 Posts,然后是昨天创建的所有 Posts,等等……我该怎么做?

谢谢,

凯文

【问题讨论】:

    标签: ruby-on-rails datetime activerecord date


    【解决方案1】:

    试试这个:

    #Today
    Posts.find(:all, conditions: { :created_at => Date.today...Date.today + 1 })
    #Yesterday
    Posts.find(:all, conditions: { :created_at => Date.today - 1...Date.today })
    

    或者这个(我认为最好):

    #Today
    Posts.find(:all, conditions: ["DATE(created_at) = ?", Date.today] )
    #Yesterday
    Posts.find(:all, conditions: ["DATE(created_at) = ?", Date.today - 1] )
    

    【讨论】:

    • 我最近发现 Date.today 可以等于 Date.tomorrow 和 Date.today 可以等于 Date.yesterday 取决于时区设置。 Date.today 使用盒子时间(通常是 UTC)和 Date.tomorrow 和昨天使用 Time.zone 所以要小心。 Date.current 使用 Time.zone,应该用来代替 Date.today
    【解决方案2】:

    通常,我将服务器上的所有日期都存储在 UTC 时区中,并让 UI 处理任何时区转换。 为了获得您所追求的那种查询以正常工作,我不得不将传入的日期按摩到一个 UTC 特定时间范围优先。

    require 'date'
    
    class Post < ActiveRecord::Base
    
      def self.created(a_date)
        return Post.where(created_at: to_timerange(a_date))
      end
    
      private
    
      def self.to_timerange(a_date)
        raise ArgumentError, "expected 'a_date' to be a Date" unless a_date.is_a? Date
        dts = Time.new(a_date.year, a_date.month, a_date.day, 0, 0, 0).utc
        dte = dts + (24 * 60 * 60) - 1
        return (dts...dte)
      end
    
    end
    

    这样你就可以调用

    # today
    posts = Post.created(Date.today)
    # yesterday
    posts = Post.created(Date.today - 1)
    

    【讨论】:

      【解决方案3】:

      要使用范围进行查询,我更喜欢以下内容:

      yesterday = Date.yesterday
      start = yesterday.beginning_of_day
      #Fri, 27 Nov 2020 00:00:00 UTC +00:00
      end = yesterday.end_of_day
      # Fri, 27 Nov 2020 23:59:59 UTC +00:00 - the value here is one second before midnight
      # meaning we should use an inclusive range using two dots:
      range = start..end
      
      Post.where(created_at: range)
      

      【讨论】:

        最近更新 更多