Bảng này được sử dụng để lưu trữ các phiên (sự kiện):
CREATE TABLE session (
id int(11) NOT NULL AUTO_INCREMENT
, start_date date
, end_date date
);
INSERT INTO session
(start_date, end_date)
VALUES
("2010-01-01", "2010-01-10")
, ("2010-01-20", "2010-01-30")
, ("2010-02-01", "2010-02-15")
;
Chúng tôi không muốn có xung đột giữa các phạm vi.
Giả sử chúng ta cần chèn một phiên mới từ 2010-01-05 đến 2010-01-25 .
Chúng tôi muốn biết (các) phiên xung đột.
Đây là truy vấn của tôi:
SELECT *
FROM session
WHERE "2010-01-05" BETWEEN start_date AND end_date
OR "2010-01-25" BETWEEN start_date AND end_date
OR "2010-01-05" >= start_date AND "2010-01-25" <= end_date
;
Đây là kết quả:
+----+------------+------------+
| id | start_date | end_date |
+----+------------+------------+
| 1 | 2010-01-01 | 2010-01-10 |
| 2 | 2010-01-20 | 2010-01-30 |
+----+------------+------------+
Có cách nào tốt hơn để đạt được điều đó không?
"2010-01-05" <= start_date AND "2010-01-25" >= end_date
. Xem stackoverflow.com/a/28802972/632951 để hình dung. Điều kiện thứ ba hiện tại của bạn sẽ không bao giờ đánh giá được, bởi vì điều kiện đầu tiên (và thứ hai) đã bao hàm nó.