это два варианта, и мне извлечение не кажется сложным
where 16 between extract(hour from start_ts) and extract(hour from end_ts)
where '16' between to_char(start_ts, 'hh24') and to_char(end_ts, 'hh24')
Обратите внимание, что если вы поместите обычный индекс в (start_ts, and_ts), то этот запрос не будет использовать его, вместо этого он будет сканировать полную таблицу. Вам потребуется индекс на основе функций, чтобы избежать полного сканирования таблицы http://www.dba -oracle.com / t_garmany_easysql_function_based_indexes_fbi.htm
Существует третий вариант, который может использовать обычный индекс, но это не совсем то, о чем вы просили, потому что здесь вам нужно будет указать день, где вы находитесь, а не только час
where to_timestamp('2011.12.06. 17', 'yyyy.mm.dd. hh24') between start_ts and end_ts
Конечно, четвертый вариант будет хранить непосредственно часы начала и окончания вместо значений меток времени.
вот код, с которым я их проверял
select * from
(select
1 as id,
to_timestamp('2011.12.06. 16:10:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts,
to_timestamp('2011.12.06. 16:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
union
select
2 as id,
to_timestamp('2011.12.06. 16:20:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts,
to_timestamp('2011.12.06. 17:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
union
select
3 as id,
to_timestamp('2011.12.06. 17:30:32', 'yyyy.mm.dd. hh24:mi:ss') as start_ts,
to_timestamp('2011.12.06. 18:18:32', 'yyyy.mm.dd. hh24:mi:ss') as end_ts
from dual
)
where 16 between extract(hour from start_ts) and extract(hour from end_ts)
--where '16' between to_char(start_ts, 'hh24') and to_char(end_ts, 'hh24')
--where to_timestamp('2011.12.06. 17', 'yyyy.mm.dd. hh24') between start_ts and end_ts
;