简体   繁体   中英

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

I need help to find out a query to check the availability of rooms in a hotel for a particular date and time duration. I am explaining it below.

Table "hotel_room_book" has the folloing columns.

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 ) VALUES (1, 13, 1, 1, 1, 564564.00, '0', '2011-06-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);

Means room_id 13 is booked for

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

I am searching for

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

I used the following logic for "room available" cases:

case1:(1,2,3 in above) Room is available

if required checkin_date and checkin_time >= booked checkout_date and checkout_time

and required checkout_date and checkout_time <= booked checkin_date and checkint_time

case2:(4 in above required date matches for availability) Room is available

if required checkin_date and checkin_time <= booked checkin_date and checkin_time

and required checkout_date and checkout_time <= booked checkin_date and checkint_time

My query is correct if I check manually,but I get zero record which is obvious. Hence can you please think on it and help me to find out the query which gives binary result yes/no or 1/0 for available/unavaible of that particular room during that particular period?

In Summary: Lets say room no 13 is booked from Dt-15-06-2011 at 3 to Dt-17-06-2011 at 12.

Again it is booked from Dt-17-06-2011 at 16 to Dt-18-06-2011 at 3. That means room number 13 is available for the duration Dt-17-06-2011 at 13 to Dt-17-06-2011 at 15.Now my question is avalability of room 13 is very clear from manual check.But what it is the mysql for it to check programaticaly.

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 ;

And this will work only if you have checkin_date and checkout_date as TIMESTAMP instead of date, as checking date and time separately will involve complex computation. (Hope you understand the problem in storing date and time in separate columns)

This query is Exactly Correct. ( Booking Date Column range) Just it running inverse.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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