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

Datointerval overlappende kontrolbegrænsning

CHECK udføres efter rækken er blevet indsat, så området overlapper med sig selv.

Du skal ændre dit WHERE for at inkludere noget som:@MyTableId <> MyTableId .

BTW, dit WHERE-udtryk kan forenkles.

Områder ikke overlapper hvis:

  • slutningen af ​​det ene område er før starten af ​​det andet
  • eller starten af ​​det ene område er efter slutningen af ​​det andet.

Som kunne skrives i SQL som:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Ophæv det for at få de områder, der gør overlap...

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

...hvilket ifølge De Morgans love er det samme som...

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

...hvilket er det samme som:

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

Så din endelige WHERE bør være:

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

[SQL violin]

BEMÆRK:Brug <= for at tillade områder at "røre". i startudtrykket, som ville producere > i det endelige udtryk.



  1. PostgreSQL er verdens bedste database

  2. JSON_QUOTE() – Sådan undslipper du tegn i strenge, der bruges som JSON-værdier i MySQL

  3. Sådan ændres kolonnedatatype fra tegn til numerisk i PostgreSQL 8.4

  4. Parallel Go-test udført mod en PostgreSQL-database, der kører på Docker