繁体   English   中英

预订日历到达和离开日期

[英]Booking Calendar Arrive & Depart Dates

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

我有一个预订表:

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-以确保在用户预订过程中没有人抓住这些日期。

好的,虽然接受的答案可以很好地完成工作,但是我仍然需要检查日期输入是否有效,主要是因为我在将主日历表中的日期添加到阻止日期的表之前正在检查日期。 无论如何,遵循SQL,似乎可以完成我需要的所有检查:

Select * From booking Where booking.unit_id = 58 And ((booking.arrive_date < '2015-07-23' And booking.depart_date >= '2015-07-24') OR (booking.arrive_date <= '2015-07-23' And booking.depart_date > '2015-07-24') OR (booking.arrive_date >= '2015-07-23' And booking.depart_date <= '2015-07-24') OR ('2015-07-23' > booking.arrive_date And '2015-07-23' < booking.depart_date ) OR ('2015-07-24' > booking.arrive_date And '2015-07-24' < booking.depart_date )) Limit 1 

由于我确实检查了表中的值,因此对我给出的解决方案进行了标记,这让我有些失望,这是我的要求之一,尽管对于实际插入而言,效率并不是那么高。

继续前进,我已经扩展了接受的答案,并根据表格添加了我正在使用的更多字段,以保存阻止的预订日期:

插入到booking_prevent(unit_id,from_date,to_date,note)SELECT 58,'2015-07-28','2015-07-29','My Note'FROM(SELECT 1)x LEFT JOIN booking_prevent y ON y.from_date < '2015-07-29'AND y.to_date>'2015-07-28'And y.unit_id = 58 WHERE y.booking_prevent_id IS NULL LIMIT 1

这很好用,但是我有点卡住了如何对条目进行更新,但是仅在有效的情况下才进行更改。 这就是我所拥有的,这是黑暗中的刺伤:

UPDATE booking_prevent SET(unit_id,from_date,to_date,note)SELECT 58,'2015-07-20','2015-07-26','Updated Note'FROM(SELECT 1)x LEFT JOIN booking_prevent y ON y.from_date < '2015-07-26'AND y.to_date>'2015-07-20'And y.unit_id = 58 WHERE y.booking_prevent_id IS NULL WHERE booking_prevent_id = 466 LIMIT 1

任何指针将不胜感激。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM