Pertama, jangan gunakan Group
sebagai nama kolom. Ini adalah kata yang dicadangkan di setiap standar SQL. Saya menamainya menjadi grp
untuk tujuan jawaban saya.
Mencoba menjadwalkan shift baru dari '2012-06-01 08:00'
ke '2012-06-03 08:00'
...
INSERT INTO tbl (prim, grp, startdate, enddate)
SELECT 1, 10, '2012-06-01 08:00', '2012-06-03 08:00'
WHERE NOT EXISTS (
SELECT *
FROM tbl
WHERE prim = 1
AND grp = 10
AND '2012-06-03 08:00' > startdate -- not >= to allow sharing a border
AND '2012-06-01 08:00' < enddate -- and not BETWEEN ... AND either
)
Perhatikan bahwa saya membandingkan:
new_end > old_start new_start < old_end
Jika Anda menggunakan BETWEEN .. AND ..
Anda memasukkan batas-batas pergeseran dalam pengujian Anda. Ini sama dengan menggunakan >=
dan <=
. Anda perlu menggunakan >
dan <=
untuk memungkinkan batas tumpang tindih.
Nah, dan coba sintaks saya yang sebagian besar disederhanakan. Tidak yakin tentang apa yang Anda miliki di sana pada awalnya.
Berikut adalah demo yang berfungsi di sqlfiddle. com
untuk bermain bersama.