Rails получает данные за последние 24 часа, начиная с 9 утра - PullRequest
0 голосов
/ 09 мая 2019

У меня есть данные, которые обеспечивают количество осадков каждые 1 час. Проблема, с которой я сталкиваюсь, состоит в том, что она регистрирует количество осадков с 9:00 до 8:30 следующего дня. Как я могу лучше всего запросить этот определенный период, используя Postgres в Rails 5?

Пока что я группируюсь по метке времени (которая является датой + временем) и выбираю время начала 9 утра, но там, где я терплю неудачу, я информирую запрос, чтобы перейти на следующий день в 8:30 утра до данные об осадках обновляются на следующий день.

@rainfall = Weather.select('DATE(timestamp) as timestamp, MAX(rain) as maxrain')
.group(:timestamp).where("timestamp::time BETWEEN '9:00:00' AND '8:30:00'")

1 Ответ

0 голосов
/ 09 мая 2019

Зная, что ваш день начинается в 9:00 и заканчивается в 8:30 следующего дня, хорошо иметь область для ваших данных.

Пример:

scope :for_day, -> (day) {
  date_time_from = Time.zone.parse("#{day.strftime('%Y-%m-%d')} 9:00")
  date_time_to = Time.zone.parse("#{(day + 1.day).strftime('%Y-%m-%d')} 8:30")

  where(timestamp: (date_time_from..date_time_to))
}

Использование:

Weather.for_day(1.day.ago) вернет: 08 May 2019 9:00 AM till 09 May 2019 8:30 AM

и затем вы можете делать с данными все, что захотите (например, group и max)


EDIT

Исходя из комментариев, я предполагаю, что вы хотите получить все данные. При этом лучше добавить в таблицу новый столбец с указанным днем.

Миграция

add_column :weathers, :day
add_index :weathers, :day

Weather.rb

class Weather < ApplicationRecord
  before_save :set_date

  scope :for_day, -> (day) {
    where(day: day)
  }

  def self.dates_for_day(day)
    date_time_from = Time.zone.parse("#{day.strftime('%Y-%m-%d')} 9:00")
    date_time_to = Time.zone.parse("#{(day + 1.day).strftime('%Y-%m-%d')} 8:30")

    return {
      day: day,
      from: date_time_from,
      to: date_time_to
    }
  end

  private

  def set_day
    # get the surrounding days to know which day to use
    surrounding_days = [
      Weather.dates_for_day(self.timestamp - 1.day),
      Weather.dates_for_day(self.timestamp),
      Weather.dates_for_day(self.timestamp + 1.day),
    ]

    self.day = surrounding_days.select { |d| self.timestamp.between?(d[:from], d[:to]) }.first[:day]
  end
end

Теперь вы можете запрашивать / группировать ваши данные так, как вы хотите

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