@uroot

Как определить, находится ли дата в диапазоне дат?

БД: Postgres

Таблица:
CREATE TABLE public.countries (
 id text NOT NULL,
 working_hours time NULL
);


working_hours - содержит две даты: 00:00:00,23:59:59

Я хочу знать, находится ли текущая дата в диапазоне дат, т.е.:
working_hours[1] <= now() =< working_hours[2]
Но все должно быть приравнено к часовому поясу 'Европа/Киев'.

Я пробую так:
SELECT
  id,
  current_time at time zone 'Europe/Kiev' between (working_hours[1] at time zone 'Europe/Kiev') and (working_hours[2] at time zone 'Europe/Kiev')  as isWork,
  working_hours,
  current_time,
  working_hours[1] at time zone 'Europe/Kiev' as start,
  working_hours[2] at time zone 'Europe/Kiev' as end
FROM
  countries;


Но по-ходу PG игнорирует приведение к тайм зоне.
666c5a44116ca172890320.png

Как правильно это сделать?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
@uroot Автор вопроса
В итоге я написал такую страшную штуку:

SELECT
  c.id,
  c.working_hours,
  (now() AT TIME ZONE 'Europe/Kiev')::time AS now_time,
  (CURRENT_DATE + c.working_hours[1]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev' AS start_time,
  (CURRENT_DATE + c.working_hours[2]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev' AS end_time,
  ((now() AT TIME ZONE 'UTC')::time BETWEEN 
    ((CURRENT_DATE + c.working_hours[1]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev')::time AND
    ((CURRENT_DATE + c.working_hours[2]) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Kiev')::time) AS is_within_working_hours
FROM
  public.countries c;


Работает. Но, наверное, это можно сделать как-то получше))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы