计算Rails Postgresql查询中的时差

时间:2018-11-21 13:29:09

标签: ruby-on-rails postgresql ruby-on-rails-3 activerecord

我需要在我的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')

1 个答案:

答案 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属性,其中包含以小时为单位的延迟,四舍五入到最接近的小时。