预订日历到达和离开日期

这似乎是一个典型的问题,但是我找不到这个问题的答案。

我有一个预订表:

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-

以确保在用户预订过程中没有人抓住这些日期。

以上是 预订日历到达和离开日期 的全部内容, 来源链接: utcz.com/qa/408404.html

回到顶部