посчитать разницу во времени в рельсах postgresql запрос - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно получить разницу во времени как результат запроса в моих рельсах (с базой данных 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 голосов
/ 21 ноября 2018

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, чтобы получить часы и округления, используя функцию Postgres round().Я пошел вперед и отлил результат как целое число, используя ::int, но это необязательно.

Объекты image_retouch_item теперь будут иметь атрибут latency_date, который будет содержать задержку в часах, округленную до ближайшего часа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...