Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Überprüfungseinschränkung für Datumsbereich überlappend

Der CHECK wird nach ausgeführt Die Zeile wurde eingefügt, sodass sich der Bereich mit sich selbst überlappt.

Sie müssen Ihr WHERE so ändern, dass es Folgendes enthält:@MyTableId <> MyTableId .

Übrigens, Ihr WHERE-Ausdruck kann vereinfacht werden.

Bereiche nicht überlappen, wenn:

  • Ende des einen Bereichs liegt vor Beginn des anderen
  • oder Beginn des einen Bereichs ist nach dem Ende des anderen.

Was in SQL geschrieben werden könnte wie:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Negieren Sie das, um die Bereiche zu erhalten, die tun überlappen...

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

...was nach den Gesetzen von De Morgan dasselbe ist wie...

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

...was dasselbe ist wie:

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

Ihr letztes WO sollte also sein:

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

[SQL-Geige]

HINWEIS:Um zuzulassen, dass sich Bereiche berühren, verwenden Sie <= im Startausdruck, was > erzeugen würde im letzten Ausdruck.