En primer lugar, no uses Group
como nombre de columna. Es una palabra reservada en todos los estándares SQL. Le cambié el nombre a grp
para el propósito de mi respuesta.
Intentando programar un nuevo turno desde '2012-06-01 08:00'
a '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
)
Tenga en cuenta que comparo:
new_end > old_start new_start < old_end
Si usa BETWEEN .. AND ..
incluye los bordes de un cambio en su prueba. Es lo mismo que usar >=
y <=
. Necesitas usar >
y <
para permitir que los bordes se superpongan.
Bueno, y pruebe mi sintaxis en gran parte simplificada. No estoy seguro de lo que tenía allí originalmente.
Aquí hay una demostración de trabajo en sqlfiddle. es
para jugar.