我需要在我的rails(有Postgres数据库(中获得时差作为查询结果
Brute Force Approach
我从数据库中查询了所有项目,然后迭代每个记录,然后以小时为单位计算时差,这非常慢。
1) @image_retouch_items = ImageRetouchItem.where(:status => '0') = Retrieved all data
2) @image_retouch_items.each do |retouch_item|
latency_date = ((Time.parse(DateTime.now.to_s) - Time.parse(retouch_item.created_at.to_s))/3600).round
end
Optimized
我需要计算查询本身的时间差(小时(,如何实现
like - ImageRetouchItem.where(:status => '0').select('(Time.parse(DateTime.now.to_s) - Time.parse(retouch_item.created_at.to_s))/3600).round')
Postgres可以使用其内部current_timestamp
:非常容易地为您做到这一点
ImageRetouchItem.where(:status => '0')
.select("*, round(extract(epoch from(current_timestamp - created_at)) / 3600)::int as latency_date")
current_timestamp - created_at
将返回一个间隔。通过从该间隔中提取epoch
,我们将其转换为秒数,然后将其除以3600,得到小时数,并使用Postgresround()
函数进行舍入。我继续使用::int
将结果转换为整数,但这是可选的。
image_retouch_item对象现在将具有latency_date
属性,该属性将包含以小时为单位的延迟,四舍五入到最接近的小时。