我需要在我的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')
答案 0 :(得分:2)
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
,我们将其转换为秒数,然后使用Postgres round()
函数将其除以3600得到小时数和四舍五入。我继续使用::int
将结果转换为整数,但这是可选的。
image_retouch_item对象现在将具有latency_date
属性,其中包含以小时为单位的延迟,四舍五入到最接近的小时。