繁体   English   中英

如何对时间戳执行查询?

[英]How to perform a query against timestamps?

我希望能够在今天之前或之后找到创建一定天数的条目。 我有一些包含时间戳的模型。 数据库中有大约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并且只查看日期。

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

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作为日期的开始。 这可能与您的期望不符。

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM