Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL, Sélection entre date/heures

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