निम्नलिखित पर विचार करें...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(book_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,arrive_date DATE NOT NULL
,depart_date DATE NOT NULL
);
INSERT INTO my_table VALUES
(1,'2015-07-20','2015-07-22'),
(2,'2015-07-22','2015-07-23'),
(3,'2015-07-19','2015-07-20');
SELECT * FROM my_table;
+---------+-------------+-------------+
| book_id | arrive_date | depart_date |
+---------+-------------+-------------+
| 1 | 2015-07-20 | 2015-07-22 |
| 2 | 2015-07-22 | 2015-07-23 |
| 3 | 2015-07-19 | 2015-07-20 |
+---------+-------------+-------------+
तो, चयन कुछ इस तरह दिख सकते हैं...
SELECT '2015-07-22','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-22'
WHERE y.book_id IS NULL
LIMIT 1;
Empty set (0.00 sec)
SELECT '2015-07-23','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
WHERE y.book_id IS NULL
LIMIT 1;
+------------+------------+
| 2015-07-23 | 2015-07-24 |
+------------+------------+
| 2015-07-23 | 2015-07-24 |
+------------+------------+
...लेकिन आपको पहले उनकी जांच करने की आवश्यकता नहीं है। मैंने जानबूझकर SELECTs को इस तरह लिखा है कि चेक INSERT के हिस्से के रूप में हो सकता है...
INSERT INTO my_table (arrive_date,depart_date)
SELECT '2015-07-23','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
WHERE y.book_id IS NULL
LIMIT 1;
SELECT * FROM my_table;
+---------+-------------+-------------+
| book_id | arrive_date | depart_date |
+---------+-------------+-------------+
| 1 | 2015-07-20 | 2015-07-22 |
| 2 | 2015-07-22 | 2015-07-23 |
| 3 | 2015-07-19 | 2015-07-20 |
| 4 | 2015-07-23 | 2015-07-24 |
+---------+-------------+-------------+
व्यवहार में, और उस उपयोगकर्ता अनुभव के आधार पर जिसे आप प्रदान करना चाहते हैं, आप पहले SELECTs चलाना चाहते हैं, ताकि उपयोगकर्ता तुरंत देख सके कि कौन सी तिथियां उपलब्ध नहीं हैं, और फिर जब बुकिंग करने की बात आती है तो INSERT चलाएँ - यह सुनिश्चित करने के लिए कि जब उपयोगकर्ता बुकिंग के बीच में था तब किसी ने उन तारीखों को नहीं पकड़ा।