sql >> Base de Datos >  >> RDS >> Sqlserver

SQL, seleccionando entre fecha/hora

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   &gt old_start
new_start &lt 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.