sql >> Database >  >> RDS >> Sqlserver

Overlappende controlebeperking voor datumbereik

De CHECK wordt na . uitgevoerd de rij is ingevoegd, zodat het bereik zichzelf overlapt.

U moet uw WHERE aanpassen om iets als:@MyTableId <> MyTableId op te nemen .

Trouwens, je WHERE-uitdrukking kan worden vereenvoudigd.

Bereiken niet overlappen als:

  • het einde van het ene bereik is voor het begin van het andere
  • of begin van het ene bereik is na het einde van het andere.

Wat in SQL zou kunnen worden geschreven zoals:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Negeer dat om de bereiken te krijgen die doen overlappen...

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

...wat volgens de wetten van De Morgan hetzelfde is als...

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

...wat hetzelfde is als:

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

Dus je laatste WAAR zou moeten zijn:

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

[SQL Fiddle]

OPMERKING:gebruik <= . om bereiken te "aanraken" in de startuitdrukking, die > . zou opleveren in de uiteindelijke uitdrukking.



  1. Hoe post-revisies te verwijderen met WP-CLI

  2. Retourneer SETOF-rijen van de PostgreSQL-functie

  3. Oracle naar PostgreSQL — Cursors en ltrees

  4. Hoe SCHEMA_ID() werkt in SQL Server