这似乎是一个典型的问题,但是我找不到这个问题的答案。
我有一个预订表:
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
您将看到我已经证明出发日期可以是到达日期,反之亦然
在添加日期之前,我检查日期范围是否与表格中的日期不冲突,重要的是允许将出发日期设为该人将要离开的到达日期,以便在我检查日期时允许这一点该表我使用以下SQL将日期添加到arrival_date,并从depart_date减去SUBTRACT:
Select * From booking Where booking.unit_id = 58 And ( DATE_ADD(booking.from_date, INTERVAL 1 DAY) BETWEEN '2015-07-23' AND '2015-07-24' OR DATE_SUB(booking.to_date, INTERVAL 1 DAY) BETWEEN '2015-07-23' AND '2015-07-24' OR '2015-07-23' BETWEEN DATE_ADD(booking.from_date, INTERVAL 1 DAY) AND DATE_SUB(booking.to_date, INTERVAL 1 DAY)) Limit 1
当我添加第一个日期时,没有问题…与第二个和第三个日期相同,这是可行的,因为我输入的第一个日期范围是介于20日和22日之间的一天。然后,我尝试添加‘2015-07-23’和‘2015-07-24’,这是使用上述SQL检查的,显然返回了结果。我需要一种允许这些日期被接受的方法,因为23号是depart_date。
任何帮助,将不胜感激
我还要提到的是,我还有一个表,其中包含阻止日期“ booking_prev”,因此在输入预订日期之前,也会使用类似的查询来检查预订日期中的阻止日期。
考虑以下…
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可能看起来像这样…
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 | +---------+-------------+-------------+
实际上,根据您要提供的用户体验,您可能需要先运行SELECT,以便用户可以立即查看哪些日期不可用,然后在进行预订时运行INSERT- 以确保在用户预订过程中没有人抓住这些日期。