Prima di tutto, non utilizzare Group
come nome di colonna. È una parola riservata in ogni standard SQL. L'ho rinominato in grp
ai fini della mia risposta.
Sto cercando di programmare un nuovo turno da '2012-06-01 08:00'
a '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
)
Nota che confronto:
new_end > old_start new_start < old_end
Se usi BETWEEN .. AND ..
includi i confini di un turno nel tuo test. È come usare >=
e <=
. Devi usare >
e <
per consentire la sovrapposizione dei bordi.
Bene, e prova la mia sintassi ampiamente semplificata. Non sono sicuro di quello che avevi originariamente.
Ecco una demo funzionante su sqlfiddle. com
con cui giocare.