CHECK se provádí po řádek byl vložen, takže rozsah se překrývá sám se sebou.
Budete muset upravit své WHERE tak, aby zahrnovalo něco jako:@MyTableId <> MyTableId
.
BTW, váš výraz WHERE lze zjednodušit.
Rozsahy není překrývají se, pokud:
- konec jednoho rozsahu je před začátkem druhého
- nebo začátek jednoho rozsahu je po konci druhého.
Což by mohlo být napsáno v SQL jako:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
Negujte to, abyste získali rozsahy, které dělají překrývají...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...což je podle De Morganových zákonů stejné jako...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...což je stejné jako:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
Takže vaše konečné KDE by mělo být:
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQL Fiddle]
POZNÁMKA:Chcete-li povolit rozsahům "dotyk", použijte <=
v počátečním výrazu, který by vytvořil >
v konečném výrazu.