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.