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

Contrainte de contrôle de chevauchement de plage de dates

Le CHECK est exécuté après la ligne a été insérée, de sorte que la plage se chevauche.

Vous devrez modifier votre WHERE pour inclure quelque chose comme :@MyTableId <> MyTableId .

BTW, votre expression WHERE peut être simplifiée.

Plages pas se chevauchent si :

  • la fin d'une plage est avant le début de l'autre
  • ou le début d'une plage est après la fin de l'autre.

Qui pourrait être écrit en SQL comme :

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Infirmez cela pour obtenir les plages qui font superposition...

WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)

...qui, selon les lois de De Morgan, est identique à...

WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)

...qui est identique à :

WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart

Donc, votre OÙ final devrait être :

WHERE
    @MyTableId <> MyTableId
    AND @DateEnd >= DateStart
    AND DateEnd >= @DateStart

[SQL Violon]

REMARQUE :pour permettre aux plages de "se toucher", utilisez <= dans l'expression de départ, ce qui produirait > dans l'expression finale.