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

Vincolo di controllo di sovrapposizione dell'intervallo di date

Il CHECK viene eseguito dopo la riga è stata inserita, quindi l'intervallo si sovrappone a se stesso.

Dovrai modificare il tuo WHERE per includere qualcosa come:@MyTableId <> MyTableId .

A proposito, la tua espressione WHERE può essere semplificata.

Gli intervalli non sovrapponi se:

  • la fine di un intervallo è prima dell'inizio dell'altro
  • o l'inizio di un intervallo è dopo la fine dell'altro.

Che potrebbe essere scritto in SQL come:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Annullalo per ottenere gli intervalli che fanno sovrapposizione...

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

...che secondo le leggi di De Morgan è uguale a...

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

...che è lo stesso di:

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

Quindi il tuo DOVE finale dovrebbe essere:

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

[SQL Fiddle]

NOTA:per consentire agli intervalli di "toccarsi", utilizzare <= nell'espressione iniziale, che produrrebbe > nell'espressione finale.