Verwenden Sie zunächst nicht Group
als Spaltenname. Es ist ein reserviertes Wort in jedem SQL-Standard. Ich habe es in grp
umbenannt zum Zweck meiner Antwort.
Versuch, eine neue Schicht ab '2012-06-01 08:00'
zu planen bis '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
)
Beachten Sie, dass ich vergleiche:
new_end > old_start new_start < old_end
Wenn Sie BETWEEN .. AND ..
verwenden Sie beziehen die Grenzen einer Verschiebung in Ihren Test ein. Es ist dasselbe wie die Verwendung von >=
und <=
. Sie müssen >
verwenden und <
Grenzen überlappen zu lassen.
Nun, und versuchen Sie es mit meiner stark vereinfachten Syntax. Ich bin mir nicht sicher, was Sie ursprünglich dort hatten.
Hier ist eine funktionierende Demo zu sqlfiddle. de
zum Spielen.