Trước hết, không sử dụng Group
dưới dạng tên cột. Nó là một từ dành riêng trong mọi tiêu chuẩn SQL. Tôi đã đổi tên nó thành grp
cho mục đích của câu trả lời của tôi.
Đang cố gắng lên lịch thay đổi mới từ '2012-06-01 08:00'
tới '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
)
Lưu ý rằng tôi so sánh:
new_end > old_start new_start < old_end
Nếu bạn sử dụng BETWEEN .. AND ..
bạn bao gồm các đường biên của một sự thay đổi trong thử nghiệm của bạn. Nó giống như cách sử dụng >=
và <=
. Bạn cần sử dụng >
và <
để cho phép các đường viền chồng lên nhau.
Vâng, và hãy thử cú pháp được đơn giản hóa của tôi. Bạn không chắc chắn về những gì bạn có ở đó ban đầu.
Đây là bản demo hoạt động trên sqlfiddle. com
để chơi với.