gpt4 book ai didi

php - 预订日历 到达和离开日期

转载 作者:行者123 更新时间:2023-11-29 22:14:14 25 4
gpt4 key购买 nike

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

我有一个预订表:

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 将日期添加到到达日期并从出发日期减去一天:

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 |
+------------+------------+

...但您不需要先检查它们。我故意以这样的方式编写 SELECT,以便检查可以作为 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预订 - 确保在用户预订中途时没有人抢走这些日期。

关于php - 预订日历 到达和离开日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31346425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com