Запрос года не дает результатов - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть модель Holiday с атрибутом holiday_date DateTime. Я добавил новый Праздник (Новый год) с датой 1/1/2019. Когда я делаю в консоли Holiday.last, я вижу это:

#<Holiday id: 50, name: "New Years Day", holiday_date: "2018-12-31 23:00:00", created_at: "2018-11-13 13:15:54", updated_at: "2018-11-13 13:15:54">

Таким образом, он сохраняется по времени UTC днем ​​ранее. Когда я тогда делаю Holiday.last.holiday_date, я получаю это:

Tue, 01 Jan 2019 00:00:00 CET +01:00

Отлично, дата конвертируется в нашу дату и время CET. Но когда я запрашиваю в течение года, как это:

Holiday.where("extract(year from holiday_date) = '2019'")

Не возвращает результатов. Таким образом, кажется, что с этим запросом нет преобразования во время CET. Как я могу убедиться, что запрос возвращает добавленный мною праздник?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вам нужно будет разыграть часовые пояса дважды:

Holiday.where(
  "extract(year from holiday_date AT TIME ZONE 'UTC' AT TIME ZONE 'CET') = '2019'"
)

Это сработает, но было бы неплохо использовать индексы для вашего запроса, нам просто нужно подготовить его лучше:

year = Time.zone.parse("2019-01-01")
Holiday.where("holiday_date BETWEEN ? AND ?", year.beginning_of_year, year.end_of_year)
# SELECT "holidays".* FROM "holidays" WHERE (holiday_date BETWEEN '2018-12-31 23:00:00' AND '2019-12-31 22:59:59.999999')

Я бы действительно подумал, нужны ли вам даты и время для столбца holiday_date, возможно, дат будет достаточно, чтобы вам не приходилось иметь дело с часовыми поясами.

0 голосов
/ 13 ноября 2018

Вы можете запросить по часовому поясу, как это

Holiday.where("extract(year from holiday_date AT TIME ZONE 'CET') = '2019'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...