Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL, Selezione tra data/ora

Prima di tutto, non utilizzare Group come nome di colonna. È una parola riservata in ogni standard SQL. L'ho rinominato in grp ai fini della mia risposta.

Sto cercando di programmare un nuovo turno da '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
    )

Nota che confronto:

new_end   &gt old_start
new_start &lt old_end

Se usi BETWEEN .. AND .. includi i confini di un turno nel tuo test. È come usare >= e <= . Devi usare > e < per consentire la sovrapposizione dei bordi.

Bene, e prova la mia sintassi ampiamente semplificata. Non sono sicuro di quello che avevi originariamente.
Ecco una demo funzionante su sqlfiddle. com con cui giocare.