PERIKSA sedang dijalankan setelah baris telah disisipkan, sehingga rentang tumpang tindih dengan dirinya sendiri.
Anda harus mengubah WHERE Anda untuk memasukkan sesuatu seperti:@MyTableId <> MyTableId
.
BTW, ekspresi WHERE Anda dapat disederhanakan.
Rentang jangan tumpang tindih jika:
- akhir rentang yang satu sebelum awal rentang lainnya
- atau awal dari satu rentang adalah setelah akhir yang lain.
Yang dapat ditulis dalam SQL seperti:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
Abaikan itu untuk mendapatkan rentang yang melakukan tumpang tindih...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...yang menurut hukum De Morgan sama dengan...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...yang sama dengan:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
Jadi WHERE terakhir Anda seharusnya:
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQL Fiddle]
CATATAN:untuk mengizinkan rentang "menyentuh", gunakan <=
dalam ekspresi awal, yang akan menghasilkan >
dalam ekspresi terakhir.