Uma consulta que não dá certo de jeito nenhum

Boa tarde gente…

O caso é o seguinte:
Estou criando um select para consultar funcionários desocupados…

Eu tenho as seguintes tabelas:

OrdemServico,

Parceiro_Comercial (dentro desta tabela tem as colunas funcionario, cliente e fornecedor todas do tipo boolean pra saber qual é o tipo de cada parceiro) e

funcionarioServico (contendo apenas idOrdemServico e idparceiroComercial)

Eu preciso fazer uma consulta em que o usuário vai digitar uma data inicial, uma data final, uma hora inicial e uma hora final e a consulta teria que
mostrar apenas os parceiros do tipo funcionario que estariam livres nesses dias. Se o funcionario estivesse vinculado a uma ordem de servico que batessem com
as datas digitadas pelo funcionario então o sistema naum retornaria estes funcionarios.

eu consegui criar um select e por um momento cheguei a pensar que estava perfeito porem eu encontrei um erro…
a consulta retornava os funcionarios que naum estavao vinculados a nenhuma ordem de servico pq obviamente eles estariam livres e mostrava tambem
os que estavam vinculados em ordem de servico que o horario naum batia mas o erro foi que se o funcionario 1 estivesse vinculado com a ordem de servico 1 e 4
no qual as datas da ordem de servico 1 não bateriam, porem as datas da ordem de servico quatro bateria o sistema retornava o funcionario como se ele estivesse livre,
sendo que neste caso ele não poderia retornar este funcionario…

a consulta que eu fiz foi a seguinte:

[code]
select pc.idparceiro,pc.nome
from parceiro_comercial as pc, ordemServico as os, funcionarioServico as fs
where pc.funcionario = ‘true’ and pc.deletado = ‘false’ and
(fs.idparceiro = pc.idparceiro and fs.idordemservico = os.idordemServico)
and os.idordemservico in (select o.idordemservico from ordemservico as o
where (‘2011-10-27’ > o.datafim) or (‘2011-10-29’ < o.dataInicio)
or (‘2011-10-27’ = o.datafim and ‘06:00’ >= o.horafim and (o.status = ‘Em andamento’ or o.status = ‘Confirmado’) )
or (‘2011-10-29’ = o.datainicio and ‘17:00’ <= o.horainicio and (o.status = ‘Em andamento’ or o.status = ‘Confirmado’)))

union

select pc.idparceiro,pc.nome from parceiro_comercial as pc where pc.funcionario = true AND pc.deletado = false AND
pc.idparceiro not in (select idparceiro from funcionarioservico)[/code]

esperam que consigam me ajudar
abrass…

Baseado no que entendi da sua explicação fiz este código, talvez ajude a acender uma luz.

select pc.idparceiro,pc.nome from parceiro_comercial as pc where pc.funcionario = 'true' and pc.deletado = 'false' and ( NOT pc.idparceiro in (select fs.idparceiro from funcionarioServico fs where fs.idparceiro = pc.idparceiro ) or NOT pc.idparceiro in (select fs.idparceiro from funcionarioServico as fs ,ordemservico as o where fs.idparceiro = pc.idparceiro and fs.idordemservico = os.idordemServico and o.dataInicio >= '2011-10-27' and o.datafim <= '2011-10-29' and o.horainicio >= '06:00' and o.horafim <= '17:00' and (o.status = 'Confirmado' or o.status = 'Em andamento' )))

Entendi que a tabela funcionarioServico é a associação entre os funcionários e as ordens de serviços, se isto for verdade então a sua instrução deve aceitar como verdade a ausencia de registros relacionados aos parametros informados; neste casos utilizei o NOT. O primeiro NOT admite a hipotese de que um funcionario começou a trabalhar recentimente e ainda não tem nenhuma ordem de serviço vinculada a ele.

O segundo NOT é para aqueles casos onde o funcionario já atendeu algumas ordens de serviços porem elas já foram fechadas (ver tipos de status); se o funcionario estiver vinculado a alguma ordem de serviço que esteja com status de “Confirmado” ou “Em andamento” tera que ser ignorado (por causa do NOT).

flws