Tout d'abord, n'utilisez pas Group
comme nom de colonne. C'est un mot réservé dans toutes les normes SQL. Je l'ai renommé grp
aux fins de ma réponse.
Tentative de planification d'un nouveau quart de travail à partir de '2012-06-01 08:00'
à '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
)
Notez que je compare :
new_end > old_start new_start < old_end
Si vous utilisez BETWEEN .. AND ..
vous incluez les frontières d'un décalage dans votre test. C'est la même chose que d'utiliser >=
et <=
. Vous devez utiliser >
et <
pour permettre aux bordures de se chevaucher.
Eh bien, et essayez ma syntaxe largement simplifiée. Je ne suis pas sûr de ce que vous aviez à l'origine.
Voici une démo de travail sur sqlfiddle. com
jouer avec.