Först och främst, använd inte Group
som ett kolumnnamn. Det är ett reserverat ord i varje SQL-standard. Jag döpte om den till grp
för syftet med mitt svar.
Försöker schemalägga ett nytt pass från '2012-06-01 08:00'
till '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
)
Observera att jag jämför:
new_end > old_start new_start < old_end
Om du använder BETWEEN .. AND ..
du inkluderar gränserna för ett skifte i ditt test. Det är samma sak som att använda >=
och <=
. Du måste använda >
och <
för att tillåta gränser att överlappa.
Tja, och prova min till stor del förenklade syntax. Inte säker på vad du hade där från början.
Här är en fungerande demo på sqlfiddle. se
att leka med.