Проверьте, покрывает ли timerange now() в Postgres

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть столбец с именем office_hours с типом данных timerange , который был определен через:

 create type timerange as range (subtype = time)
  

Я хочу написать запрос, который проверяет, включен ли now() в этот временной диапазон. То, что я ищу, это что-то похожее на:

 select now() <@ office_hours from users where office_hours is not null;
  

Всякий раз, когда я пытаюсь выполнить этот запрос, я получаю это сообщение об ошибке:

сообщение об ошибке dbeaver

Каков правильный способ запросить, содержит ли timerange now() ?

Ответ №1:

Сообщение об ошибке уже давало хороший намек. Поскольку у вас есть возможность создать time диапазон, вам нужно будет привести now() к time, прежде чем проверять наличие содержимого.

Рассмотрим:

 select now()::time <@ office_hours from users where office_hours is not null;
  

Демонстрация на скрипте DB:

 create type timerange as range (subtype = time);
select now(), now()::time <@ timerange('[20:00,23:00]') contained;
  

Выдает:

 | now                      | contained |
| ------------------------ | --------- |
| 2019-04-05T20:54:13.113Z | true      |
  

Комментарии:

1. Или используйте localtime вместо now()::time