[英]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.