Primeiro, não use
Group
como um nome de coluna. É uma palavra reservada em todos os padrões SQL. Eu o renomeei para grp
para efeito da minha resposta. Tentando agendar um novo turno de
'2012-06-01 08:00'
para '2012-06-03 08:00'
... INSERT INTO tbl (prim, grp, startdate, enddate)
SELECT 1, 10, '2012-06-01 08:00', '2012-06-03 08:00'
WHERE NOT EXISTS (
SELECT *
FROM tbl
WHERE prim = 1
AND grp = 10
AND '2012-06-03 08:00' > startdate -- not >= to allow sharing a border
AND '2012-06-01 08:00' < enddate -- and not BETWEEN ... AND either
)
Note que eu comparo:
new_end > old_start new_start < old_end
Se você usar
BETWEEN .. AND ..
você inclui as bordas de um deslocamento em seu teste. É o mesmo que usar >=
e <=
. Você precisa usar >
e <
para permitir que as bordas se sobreponham. Bem, e tente minha sintaxe amplamente simplificada. Não tenho certeza sobre o que você tinha lá originalmente.
Aqui está uma demonstração de trabalho no sqlfiddle. com Brincar com.