簡體   English   中英

mysql 查詢特定日期和時間段內酒店的客房供應情況

[英]mysql to check room availability in a hotel for a particular date and time duration

我需要幫助來找出一個查詢,以檢查特定日期和時間段內酒店房間的可用性。 我在下面解釋。

表“hotel_room_book”有以下幾列。

CREATE TABLE IF NOT EXISTS `hotel_room_book` (
  `hotel_room_book_id` int(10) NOT NULL AUTO_INCREMENT,
  `hotel_room_id` int(10) NOT NULL,
  `hotel_id` int(10) NOT NULL,
  `who_has_booked` int(10) NOT NULL,
  `booked_for_whom` int(10) NOT NULL,
  `room_price` float(10,2) NOT NULL,
  `book_status` enum('0','1') NOT NULL DEFAULT '0',
  `booking_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `checkin_date` date NOT NULL,
  `checkin_time` int(4) NOT NULL,
  `checkout_date` date NOT NULL,
  `checkout_time` int(4) NOT NULL,
  PRIMARY KEY (`hotel_room_book_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;

INSERT INTO hotel_room_book ( hotel_room_book_id , hotel_room_id , hotel_id , who_has_booked , booked_for_whom , room_price , book_status , booking_date , checkin_date , checkin_time , checkout_date , checkout_time ) 值 (1, 13, 1, 1, 1, 564564.00, '11-', '02 -15 00:00:00', '2011-06-15', 3, '2011-06-17', 12), (2, 13, 1, 1, 1, 564564.00, '0', '2011- 06-15 00:00:00', '2011-06-17', 16, '2011-06-18', 3), (3, 13, 1, 1, 1, 23.00, '0', '2011 -06-01 00:00:00', '2011-06-19', 5, '2011-06-20', 18);

表示 room_id 13 已被預訂

slno     checkin_date     checkin_time     checkout_date   checkout_time

 1        15-06-2011      3                 17-06-2011      12

 2        17-06-2011      16                18-06-2011      3

 3        19-06-2011      5                 20-06-2011      18

我正在尋找

slno     checkin_date     checkin_time     checkout_date     checkout_time

1         17-06-2011       13                    17-06-2011       15

2        18-06-2011        4                     19-06-2011       4

3        14-06-2011        2                     15-06-2011       1

4        20-06-2011        19                    21-06-2011       2

對於“可用房間”案例,我使用了以下邏輯:

case1:(上面的1,2,3)房間有空

如果需要 checkin_date 和 checkin_time >= booked checkout_date 和 checkout_time

並且要求 checkout_date 和 checkout_time <= 預訂的 checkin_date 和 checkint_time

案例 2:(4 個以上要求的日期與可用性相匹配)房間可用

如果需要 checkin_date 和 checkin_time <= 預訂的 checkin_date 和 checkin_time

並且要求 checkout_date 和 checkout_time <= 預訂的 checkin_date 和 checkint_time

如果我手動檢查,我的查詢是正確的,但我得到的是零記錄,這很明顯。 因此,您能否考慮一下並幫助我找出在特定時期內該特定房間的可用/不可用的二進制結果為是/否或 1/0 的查詢?

總結:假設 13 號房間從 Dt-15-06-2011 3 點到 Dt-17-06-2011 12 點被預訂。

再次從 Dt-17-06-2011 16 點到 Dt-18-06-2011 3 點預訂。這意味着 13 號房間在 Dt-17-06-2011 13 點到 Dt-17-06 期間可用-2011 年 15 點。現在我的問題是 13 號房間的可用性從手動檢查中非常清楚。但是它要以編程方式檢查 mysql 是什么。

SELECT * FROM hotel_room_book a , hotel_room_book b WHERE a.checkout_date<= 
 $new_checkin_date  AND b.checkin_date >= $new_checkout_date AND a.hotel_id = 
 b.hotel_id AND a.hotel_room_id = b.hotel_room_id ;

這只有在您將 checkin_date 和 checkout_date 作為 TIMESTAMP 而不是日期時才有效,因為分別檢查日期和時間將涉及復雜的計算。 (希望您了解在單獨的列中存儲日期和時間的問題)

這個查詢是完全正確的。 (預訂日期列范圍)正好相反。

 SELECT * FROM `bookings` WHERE `room_id` = 1  
 AND booking_end >= $from AND booking_start <= $to

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM