Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Restrição de verificação de sobreposição de intervalo de datas


O CHECK está sendo executado depois a linha foi inserida, então o intervalo se sobrepõe a si mesmo.

Você precisará alterar seu WHERE para incluir algo como:@MyTableId <> MyTableId .

BTW, sua expressão WHERE pode ser simplificada.

Intervalos não se sobrepõem se:
  • o fim de um intervalo é anterior ao início do outro
  • ou o início de um intervalo é posterior ao final do outro.

Que poderia ser escrito em SQL como:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Negue isso para obter os intervalos que fazem sobreposição...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)

...que de acordo com as leis de De Morgan é o mesmo que...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)

...que é o mesmo que:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart

Então, seu final WHERE deve ser:
WHERE
    @MyTableId <> MyTableId
    AND @DateEnd >= DateStart
    AND DateEnd >= @DateStart

[Fiddle SQL]

OBSERVAÇÃO:para permitir que os intervalos "toquem", use <= na expressão inicial, que produziria > na expressão final.