Ruby on rails 在RubyonRails中查找最接近给定时间的记录

Ruby on rails 在RubyonRails中查找最接近给定时间的记录,ruby-on-rails,timestamp,Ruby On Rails,Timestamp,背景 我有一个ror应用程序,它在网站上连续记录和显示实时传感器数据。然后我有一个名为传感器的表,其中有所有传感器的唯一列表,并存储最新值 我还有另一个表histories,它转储每个传感器接收到的所有传感器值 因此关系为“传感器有许多历史”,时间戳列记录创建时间戳 并非所有传感器都以相同的间隔或频率更新 问题 现在我想从用户那里获取一个输入时间戳,一个过去的日期和时间,并显示传感器当时显示的内容。例如,假设我想看看昨天下午2点所有传感器的样子,一旦我从用户那里得到了这个时间戳,我如何从历史记录

背景

我有一个ror应用程序,它在网站上连续记录和显示实时传感器数据。然后我有一个名为传感器的表,其中有所有传感器的唯一列表,并存储最新值

我还有另一个表histories,它转储每个传感器接收到的所有传感器值

因此关系为“传感器有许多历史”
时间戳列记录创建时间戳

并非所有传感器都以相同的间隔或频率更新

问题

现在我想从用户那里获取一个输入时间戳,一个过去的日期和时间,并显示传感器当时显示的内容。例如,假设我想看看昨天下午2点所有传感器的样子,一旦我从用户那里得到了这个时间戳,我如何从历史记录表中检索到一个最接近输入时间戳的传感器值

我希望在传感器模型中添加一个方法,该方法将时间戳作为参数,并从历史记录表中检索最接近输入时间戳的值。

编写此活动记录查询的最简单方法是什么

谢谢
Shaunak

只需根据传递的时间戳和历史时间戳之间的差异对历史进行排序(绝对值,以便它可以在任意方向上移动),然后返回顶部结果(即差异最小的结果)

请注意,对于这个查询,我假设您使用的是MySQL(因为我使用的是MySQL方法ABS),并且我还假设
time\u stamp
字段存储为unix时间戳,用户输入也是如此。如果数据库存储或输入的格式不同,则必须使用不同的日期算术函数。有关详细信息,请参阅。或者,如果您没有使用MySQL,请参阅您正在使用的数据库的文档

还请注意,我正在使用
.to_I
为查询清理数据。如果数据的格式不同,则可能需要以不同的方式对其进行清理

为了提高效率,请将其限制为最大可能范围内的时间跨度。如果传感器每隔10分钟或更频繁地采集数据(两次读数之间的间隔不得小于10分钟),则每侧的范围应大于10分钟。像下面这样。这里,600=10(分钟)*60(秒):


sensor.histories.where(“time_stamp>=?和time_stamp=?和time_stamp只需根据传递的时间戳和历史时间戳之间的差异对历史进行排序(绝对值,以便它可以在任意方向上移动),并返回顶部结果(即差异最小的结果)

注意,对于这个查询,我假设您使用的是MySQL(因为我使用的是MySQL方法)我还假设
time\u stamp
字段存储为unix时间戳,用户输入也是如此。如果数据库存储或输入的格式不同,则必须使用不同的日期算术函数。有关详细信息,请参阅。或者,如果未使用MySQL,请参阅所使用数据库的文档

还请注意,我正在使用
.to\u I
清理我的查询数据。如果数据的格式不同,则可能需要以不同的方式清理数据

为了提高效率,将其限制在最大可能范围内的时间跨度内。如果传感器每10分钟或更频繁地采集一次数据(两次读数之间的间隔不得小于10分钟),则每侧的时间跨度应大于10分钟。如下所示。这里,600=10(分钟)*60(秒):


sensor.history.where(“时间戳>=?和时间戳=?和时间戳感谢您的快速回答!在结束呼叫之前,还有一件事,每个传感器每10分钟更新一次,我有大约一年的数据!所以每次我想读取一个传感器的值时,排序整件事情不会花费很多时间吗?有什么方法可以优化givin告诉我的查询吗基于输入时间戳的某个跨度?我正在使用MS SQL Server 2008。再次感谢!是的,你可以将它限制在合理的时间戳中考虑。我用一些细节更新了我的答案。如果它是对多个传感器的查询呢?有没有一个方法可以在没有碰到每个传感器的数据库的情况下找到一个查询?谢谢。快速回答!在结束呼叫之前还有一件事,每个传感器每10分钟更新一次,我有大约一年的数据!所以每次我想读取一个传感器的值时,对整个事情进行排序不会花费很多时间吗?有没有什么方法可以优化你告诉我的查询,根据输入的时间戳给出一些跨度?我使用的是MS SQL Server 2008。再次感谢!是的,你可以把它限制在合理的时间戳中考虑。我用一些细节更新了我的答案。如果它是对多个传感器的查询呢?有没有一种方法可以在没有碰到每个传感器的数据库的情况下完成一个查询?
sensor.histories.order("ABS(time_stamp - #{params[:time_stamp].to_i})").first
sensor.histories.where("time_stamp >= ? AND time_stamp <= ?", params[:time_stamp].to_i - 600, params[:time_stamp].to_i + 600).order("ABS(time_stamp - #{params[:time_stamp].to_i})").first
class Sensor < ActiveRecord::Base
    def history_at(time_stamp)
        self.histories.where("time_stamp >= ? AND time_stamp <= ?", time_stamp.to_i - 600, time_stamp.to_i + 600).order("ABS(time_stamp - #{time_stamp.to_i})").first
    end
end