Запрос Postgresql между временными диапазонами в столбце метки времени

Предполагая, что таблица со столбцом timestamp, например

my_db=# \d l1
                                     Tabelle »public.l1«
    Spalte     |              Typ               | Sortierfolge | NULL erlaubt? | Vorgabewert 
---------------+--------------------------------+--------------+---------------+-------------
 timestamp     | timestamp(6) without time zone |              | not null      | 

Каков наиболее эффективный способ запроса тех строк, которые соответствуют

<stub>
time(timestamp)>='10:00:00' and time(timestamp)<='10:30:00'
</stub>

Мне не удалось найти подходящего оператора BETWEEN.


person gies0r    schedule 19.01.2020    source источник
comment
Привет, gies0r Помогает ли tsrange Postgres? Ссылка stackoverflow.com/a/48117316/1123335   -  person    schedule 19.01.2020
comment
@pnorton Не похоже, что это подходит.. Из документов: tsrange — диапазон меток времени без часового пояса. Это не то, что я ищу (потому что это фильтрует между двумя полями даты и времени). То, что я ищу, - это фильтр диапазона, который игнорирует часть даты столбца метки времени и фильтрует только время суток.   -  person gies0r    schedule 19.01.2020


Ответы (1)


Эффективность вашего запроса скорее будет зависеть от вашего объема данных и метода индексации. При этом вы можете просто привести столбец timestamp к time и использовать между ними, как вы предложили:

SELECT * FROM l1
WHERE CAST(timestamp AS TIME) BETWEEN '10:00:00' AND '13:00:00';

или если вам не нужно придерживаться SQL Ansi (имхо, гораздо более крутая нотация)..

SELECT * FROM l1
WHERE timestamp::TIME BETWEEN '10:00:00' AND '13:00:00';
person Jim Jones    schedule 19.01.2020
comment
@gies0r рад, что это помогло :) - person Jim Jones; 20.01.2020