如何对时间戳执行查询?

时间:2012-09-07 01:14:25

标签: mysql ruby-on-rails ruby date

我希望能够在今天之前或之后找到创建一定天数的条目。我有一些包含时间戳的模型。数据库中大约有70,000条记录正在运行.all.each需要相当长的时间。

我希望做一些像

这样的事情
Model.find_by_updated_at(Date.today - 1)

看来,updated_at实际上返回的是Time类,而不是Date;因为它精确到几分钟和几秒钟,我不能做像

这样的事情
Model.find_by_updated_at(Time.now + 10000) # ten thousand seconds

因为我的请求只想查找特定日期更改的模型。

使用find有没有办法做到这一点?

我想我可以编写自己的SQL查询而不是使用find但我不知道如何构建它以排除通过hh:mm:ss搜索并只查看日期。

2 个答案:

答案 0 :(得分:2)

您的查询正在查找在特定时间创建的模型。您可能想要的是返回在特定时间之后创建的内容:

Model.where('updated_at>=?', Date.today - 1)

或许在一个范围内:

Model.where('updated_at BETWEEN ? AND ?', Date.today - 1, Date.today)

有几种方法可以做到这一点。如果您经常这样做,您可能会发现创建可索引DATE列的速度更快。

另一种方法是动态地执行:

Model.where('DATE(updated_at)=?', Date.today - 1)

几乎总是可以在ActiveRecord术语中表达您想要的内容而无需编写自己的查询。事实上,除非你有充分的理由要求你的代码更易于维护,否则最好不要这样做。

请记住,“日”充其量是一个相当模糊的概念。如果您以UTC时间存储数据,则需要对开始和结束时间进行调整,或者您将使用UTC 00:00:00作为日期的开始。这可能与您的期望不符。

答案 1 :(得分:1)

您可以在模型上创建一个如下所示的方法:

def self.updated_on_date(date)
   where('updated_at BETWEEN ? AND ?', date.beginning_of_day, date.end_of_day)
end

然后你就可以这样称呼它

Model.updated_on_date(Date.today-1)