Formulei a query abaixo. Espero que lhe ajude. Montei essa query no banco Oracle. Os comandos podem variar conforme o banco, mas a lógica é a mesma:
select *
from (
/* Essa SubQuery serve apenas para simular a sua tabela*/
select 1 agenda
, 1 campo_id
, to_date(‘08:00’,‘hh24:mi’) campo_hora_ini
, to_date(‘11:00’,‘hh24:mi’) campo_hora_fin
, to_date(‘22/05/2015’,‘dd/mm/rrrr’) campo_data_ini
, to_date(‘22/05/2015’,‘dd/mm/rrrr’) campo_data_fin
, ‘01’ campo_sala
from dual
)
where to_date(‘22/05/2015’,‘dd/mm/rrrr’) between campo_data_ini and campo_data_fin /* verifica se há registro para essa data /
and (
(
to_date(‘14:00’,‘hh24:mi’) > campo_hora_ini / comparando se a data inicial do agendamento é maior que algum outro campo_hora_ini existente /
and to_date(‘14:00’,‘hh24:mi’) < campo_hora_fin / comparando se a data inicial do agendamento é menor que algum outro campo_hora_fin existente /
)
or
(
to_date(‘16:00’,‘hh24:mi’) > campo_hora_ini / comparando se a data final do agendamento é maior que algum outro campo_hora_ini existente /
and to_date(‘16:00’,‘hh24:mi’) < campo_hora_fin / comparando se a data final do agendamento é maior que algum outro campo_hora_ini existente /
)
or
(
campo_hora_ini between to_date(‘14:00’,‘hh24:mi’) and to_date(‘16:00’,‘hh24:mi’) / comparando se existe algum campo_hora_ini dentro do período de agendamento informado pelo usuário /
and campo_hora_fin between to_date(‘14:00’,‘hh24:mi’) and to_date(‘16:00’,‘hh24:mi’) / comparando se existe algum campo_hora_fin dentro do período de agendamento informado pelo usuário */
)
)
Faça testes trocando os valores das horas / datas. Do jeito que está acima, a query não retornará dados e isso significa que não existe compromissos existentes para esse período, permitindo que seja agendado esse horário.