sql >> Base de Datos >  >> RDS >> Sqlserver

Restricción de verificación de superposición de rango de fechas

El CHECK se está ejecutando después la fila se ha insertado, por lo que el rango se superpone consigo mismo.

Deberá modificar su DONDE para incluir algo como:@MyTableId <> MyTableId .

Por cierto, tu expresión WHERE se puede simplificar.

Los rangos no superposición si:

  • el final de un rango está antes del comienzo del otro
  • o el comienzo de un rango es posterior al final del otro.

Que podría escribirse en SQL como:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Niéguelo para obtener los rangos que hacen superposición...

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

...que según las leyes de De Morgan es lo mismo que...

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

...que es lo mismo que:

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

Así que tu DÓNDE final debería ser:

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

[Violín SQL]

NOTA:para permitir que los rangos se "toquen", use <= en la expresión inicial, lo que produciría > en la expresión final.