Gebruik ten eerste geen Group
als kolomnaam. Het is een gereserveerd woord in elke SQL-standaard. Ik heb het hernoemd naar grp
voor het doel van mijn antwoord.
Ik probeer een nieuwe dienst te plannen vanaf '2012-06-01 08:00'
naar '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
)
Merk op dat ik vergelijk:
new_end > old_start new_start < old_end
Als u BETWEEN .. AND ..
. gebruikt je neemt de grenzen van een shift mee in je toets. Het is hetzelfde als het gebruik van >=
en <=
. U moet >
. gebruiken en <
om randen te laten overlappen.
Nou, en probeer mijn grotendeels vereenvoudigde syntaxis. Ik weet niet zeker wat je daar oorspronkelijk had.
Hier is een werkende demo op sqlfiddle. com
om mee te spelen.