Po pierwsze, nie używaj Group
jako nazwę kolumny. Jest to słowo zastrzeżone w każdym standardzie SQL. Zmieniłem jego nazwę na grp
na potrzeby mojej odpowiedzi.
Próbuję zaplanować nową zmianę z '2012-06-01 08:00'
do '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
)
Zauważ, że porównuję:
new_end > old_start new_start < old_end
Jeśli używasz BETWEEN .. AND ..
uwzględniasz granice zmiany w swoim teście. To to samo, co użycie >=
i <=
. Musisz użyć >
i <
aby umożliwić nakładanie się granic.
No i wypróbuj moją w dużej mierze uproszczoną składnię. Nie masz pewności, co tam miałeś.
Oto działająca demonstracja sqlfiddle. pl
do zabawy.