KIỂM TRA đang được thực hiện sau khi hàng đã được chèn, do đó, phạm vi trùng lặp với chính nó.
Bạn sẽ cần sửa đổi WHERE của mình để bao gồm một số thứ như:@MyTableId <> MyTableId
.
BTW, biểu thức WHERE của bạn có thể được đơn giản hóa.
Phạm vi không chồng chéo nếu:
- kết thúc của một phạm vi trước khi bắt đầu phạm vi khác
- hoặc bắt đầu của một phạm vi là sau khi kết thúc của phạm vi khác.
Có thể viết bằng SQL như:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
Phủ nhận điều đó để nhận được các phạm vi làm chồng chéo ...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
... mà theo luật của De Morgan cũng giống như ...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
... giống như:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
Vì vậy, WHERE cuối cùng của bạn phải là:
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQL Fiddle]
LƯU Ý:để cho phép các dải ô "chạm", hãy sử dụng <=
trong biểu thức bắt đầu, sẽ tạo ra >
trong biểu thức cuối cùng.