Shahkalpesh đã trả lời câu hỏi bằng:
Tôi đã đăng một nhận xét mà tôi cho rằng điều này là sai, đưa ra một số ví dụ ngược lại:
Để trả lời nhận xét của tôi, Shahkalpesh đã yêu cầu:
Đủ công bằng - có. Đã chỉnh sửa một chút, câu hỏi cho biết:
- từ 7 giờ sáng đến 1 giờ chiều hoặc
- từ 9 giờ sáng đến 1 giờ chiều hoặc
- từ 9 giờ sáng đến 5 giờ chiều.
Đủ nền. Chúng ta có thể bỏ qua ngày của các cuộc hẹn, và chỉ xem xét thời gian. Tôi giả định rằng có một cách dễ dàng để giới hạn thời gian được ghi ở định dạng hh:mm; không phải tất cả DBMS đều thực sự cung cấp điều đó, nhưng phần mở rộng để xử lý hh:mm:ss là không đáng kể.
Appointments
Row timeStart timeEnd Note
1 07:00 13:00 First valid range
2 09:00 13:00 Second valid range
3 09:00 17:00 Third valid range
4 14:00 17:00 First plausibly valid range
5 05:00 06:00 First probably invalid range
6 18:00 22:30 Second probably invalid range
Với một tìm kiếm các cuộc hẹn trùng lặp trong phạm vi 09:00 - 13:00, truy vấn (đơn giản hóa) của Shahkalpesh sẽ trở thành:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
Điều này sẽ trả về tất cả sáu hàng dữ liệu. Tuy nhiên, chỉ có hàng 1, 2, 3 trùng vào khoảng thời gian 09:00 - 13:00. Nếu các hàng 1, 2 và 3 là giá trị cuộc hẹn đại diện hợp lệ duy nhất, thì truy vấn của Shahkalpesh tạo ra câu trả lời chính xác. Tuy nhiên, nếu hàng 4 (mà tôi nghĩ là hợp lệ) được cho phép, thì không nên trả lại hàng đó. Tương tự, các hàng 5 và 6 - nếu có - sẽ không được trả lại. [ Trên thực tế, giả sử timeStart <= timeEnd
đối với tất cả các hàng trong bảng (và không có giá trị NULL nào để làm rối tung mọi thứ), chúng ta có thể thấy rằng truy vấn của Shahkalpesh sẽ trả về BẤT KỲ hàng dữ liệu nào cho truy vấn 09:00-13:00 vì thời gian bắt đầu của hàng lớn hơn 09:00 hoặc thời gian kết thúc nhỏ hơn 13:00 hoặc cả hai. Điều này tương đương với việc viết 1 = 1
hoặc bất kỳ từ ngữ nào khác trong mệnh đề WHERE. ]
Nếu chúng ta coi truy vấn của ShaneD (như đã được đơn giản hóa):
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
chúng ta thấy rằng nó cũng chọn các hàng 1, 2 và 3, nhưng nó từ chối các hàng 4 (vì timeStart> '13:00'), 5 (vì timeEnd <'09:00 ') và 6 (vì timeStart>' 13:00 '). Biểu thức này là một ví dụ nguyên mẫu về cách chọn các hàng 'chồng chéo', đếm các hàng 'gặp nhau' và 'gặp nhau' (xem " Đại số khoảng cách của Allen ", chẳng hạn) là chồng chéo. Việc thay đổi '> =' và '<=' sẽ thay đổi tập hợp các khoảng thời gian được tính là chồng chéo.