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

SQL, Vælg mellem dato/klokkeslæt

Først og fremmest, brug ikke Group som kolonnenavn. Det er et reserveret ord i enhver SQL-standard. Jeg omdøbte den til grp med henblik på mit svar.

Forsøger at planlægge et nyt vagt fra '2012-06-01 08:00' til '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
    )

Bemærk, at jeg sammenligner:

new_end   &gt old_start
new_start &lt old_end

Hvis du bruger BETWEEN .. AND .. du medtager grænserne for et skift i din test. Det er det samme som at bruge >= og <= . Du skal bruge > og < for at tillade grænser at overlappe.

Nå, og prøv min stort set forenklede syntaks. Ikke sikker på, hvad du havde der oprindeligt.
Her er en fungerende demo på sqlfiddle. com at lege med.




  1. Sådan læser du flere resultatsæt returneret fra en SQL Server-lagret procedure i R

  2. Hjælp med SQL-forespørgsel for at finde næste ledige dato for et reservationssystem

  3. Valg af flere max()-værdier ved hjælp af en enkelt SQL-sætning

  4. Kolonnenavnet Fornavn angivet i PIVOT-operatoren er i konflikt med det eksisterende kolonnenavn i PIVOT-argumentet