我需要帮助才能找到一个查询来检查酒店房间在特定日期和时间段的可用性。 我在下面解释。
表“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,11,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);
表示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
我对“可用房间”案例使用了以下逻辑:
案例1 :(上述1,2,3) 房间可用
如果需要checkin_date和checkin_time> =已预订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用于检查programaticaly。
答案 0 :(得分:0)
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而不是date时,这才有效,因为单独检查日期和时间将涉及复杂的计算。 (希望您了解在单独的列中存储日期和时间的问题)
答案 1 :(得分:0)
此查询完全正确。 (“预订日期”列的范围)它正好相反。
SELECT * FROM `bookings` WHERE `room_id` = 1
AND booking_end >= $from AND booking_start <= $to