簡體   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