【问题标题】:Hotel Reservation System SQL query not returning output for date range for availability of room酒店预订系统 SQL 查询未返回房间可用性日期范围的输出
【发布时间】:2016-01-18 17:13:45
【问题描述】:

CREATE PROCEDURE AVAILABILITY 

AS
DECLARE @check_in AS DATETIME
DECLARE @check_out AS DATETIME


SELECT room_id,room_type 
FROM room
WHERE room_id NOT IN 
(
    SELECT room_id 
    FROM   reservation B
           JOIN RoomReservation RB
               ON B.r_id = RB.r_id
    WHERE  (check_in <= @check_in AND check_out >= @check_in)
	)
	GO  
	Exec AVAILABILITY 




create table room(
room_id varchar(5) not null,
room_price varchar(7) not null,
room_type varchar(10) NOT NULL CHECK (room_type IN('Single', 'Deluxe', 'Superior')),
occupied  BIT DEFAULT 0 not null,
constraint Room_PK primary key(room_id)
)


create table reservation(
c_id varchar(5) ,
--room_id varchar(5) ,
r_id varchar(5) not null,
e_id varchar(5),
check_in date not null,
check_out date null,
constraint R_PK primary key(r_id),
constraint R_FK foreign key(c_id) references customer,
constraint R_FK1 foreign key(e_id) references employ,
--constraint RM_FK foreign key(room_id) references room
)



create table RoomReservation(
room_id varchar(5),
r_id varchar(5),
constraint RR_FK foreign key(room_id) references room,
constraint RoomR_FK1 foreign key(r_id) references reservation
)

insert into RoomReservation(r_id,room_id)
values --('T1','A1'),
--        ('T2','A2'),
--		('T3','A3'),
--		('T4','A4'),
--		('T5','A3'),
	--	('T6','B11'),
	--	('T7','B12'),
	--	('T8','A4'),
	--	('T9','A5'),
	--	('T10','A1'),
	--	('T11','A7'),
	--	('T12','C25')



insert into customer(c_id,phone,name,CNIC,m_id)
values--('C01','0418814342','saad','3330195894431','M01'),
		--('C02','0418814212','shahbaz','3330195894432','M02'),
		--('C03','0418814111','feroz','3330195894433',Null),
		--('C04','0418814222','serene','3330195894434','M03'),
         ('C05','0418814333','zoe','3330195894435',Null),
--		('C06','0418814444','aslam','3330195894436',Null),
--	('C07','0418814555','saleem','3330195894437','M04'),
--		('C08','0418814666','zia','3330195894438',Null),
--		('C09','0418814777','sami','3330195894439',Null),
		--('C10','0418814888','usman','3330195894430',Null)
select * from customer

insert into room(room_id,room_price,room_type,occupied)
values('A1','2000','deluxe',1),
('A2','2000','deluxe',1),
('A3','4000','superior',0),
('A4','5000','single',0),
('A5','2000','deluxe',1),
('A6','2000','deluxe',1),
('A7','4000','superior',0),
('A8','5000','single',0),
('A9','2000','deluxe',1),
('A10','4000','superior',0),
('B11','5000','single',0),
('B12','5000','single',0),
('B13','2000','deluxe',1),
('B14','4000','superior',0),
('B15','5000','single',0),
('B16','5000','single',0),
('B17','5000','single',0),
('B18','2000','deluxe',1),
('B19','2000','deluxe',1),
('B20','4000','superior',0),
('C21','4000','superior',0),
('C22','5000','single',0),
('C23','2000','deluxe',1),
('C24','4000','superior',0),
('C25','2000','deluxe',1)


select * from room

insert into reservation(c_id,r_id,e_id,check_in,check_out) 
values--('C01','T1','E0001','1-17-2015','1-18-2015'),
		--('C01','T3','E0001','2-2-2015','2-6-2015'),
		--('C02','T4','E0001','3-12-2015','3-15-2015'),
		('C03','T5','E0002','3-12-2015','3-15-2015'),
		('C03','T6','E0001','3-15-2015','3-17-2015'),
		('C05','T7','E0003','3-17-2015','3-18-2015'),
		('C06','T8','E0001','3-17-2015',Null),
		('C07','T9','E0003','3-19-2015','3-20-2015'),
		('C08','T10','E0001','4-12-2015','4-13-2015'),
		('C09','T11','E0003','4-13-2015','4-14-2015'),
		('C10','T12','E0001','4-14-2015','4-20-2015')

相反,它返回酒店中的所有房间列表,而不是指定日期内的可用房间。我曾多次尝试编写一个程序或触发器来将房间的占用列从 0 更新为 1,从 1 更新为 0,但我所有的尝试都失败了。 编辑: 好的,上面已经解决了。 我有三个实体,ROOMROOMRESERVATIONRESERVATION。 如何在房间被预订后更新被占用状态为 1,在不再被保留时更新为 0。

【问题讨论】:

  • 也许你应该使用 check_out 参数而不是使用 check_in 两次。
  • 我开始尝试帮助您解决问题,但您的代码无法运行。建表脚本缺失、部分示例数据被注释掉等

标签: sql sql-server select


【解决方案1】:

您的查询中有一些错误 我希望你必须得到 check_in date 和 check_out 作为参数 所以查询应该是下面的

CREATE PROCEDURE AVAILABILITY 
 @check_in AS DATETIME,
 @check_out AS DATETIME
AS

SELECT room_id,room_type 
FROM room
WHERE room_id NOT IN 
(
    SELECT room_id 
    FROM   reservation B
           inner JOIN RoomReservation RB
               ON B.r_id = RB.r_id
    WHERE  (check_in <= @check_in AND check_out >= @check_in)
    )
    GO  

and you can call the procedure like 


exec AVAILABILITY '1-17-2015','1-18-2015'

【讨论】:

  • 仍然没有运气。即使是简单的代码返回酒店中所有可能的房间也被返回
  • 您的子查询目前只会获取那些完全被现有预订包围的房间。您可能想要考虑所有重叠。
  • 你能帮我处理被占用的实体吗?我想在房间被预订后使用视图或触发器来更新占用的信息。?我尝试使用内部连接并将保留的房间更新为 1,但所有房间都变成了 1。
【解决方案2】:

这可能就是你想要的:

SELECT room_id,room_type 
FROM room
WHERE room_id NOT IN 
(
    SELECT room_id 
    FROM   reservation B
           JOIN RoomReservation RB
               ON B.r_id = RB.r_id
    WHERE  (check_out >= @check_in AND check_in <= @check_out)
    )

至少我几年前编写预订引擎时就是这样做的。

【讨论】:

  • 你能帮忙处理被占用的列吗?我似乎无法将其更新为 1,如果更新为 1 则无法更改回 0?
  • 您尚未发布用于更新已占用列的代码。将该代码添加到您的问题中,我们可以帮助调试它。
  • SELECT RoomReservation.room_id,room.occupied FROM RoomReservation INNER JOIN room ON RoomReservation.room_id=room.room_id UPDATE room SETowned=1 selectoccupied from room Inner join RoomReservation ON room.room_id=RoomReservation.room_id INNER JOIN 预订 ON reservation.r_id=RoomReservation.room_id SELECT reservation.checkout,room. FROM room WHERE check_out 不为空 UPDATE room SEToccured=0
  • 你能写吗?其中 reservation.room_id=roomreservation.room_id
  • 我不能,因为我不明白你想用更新语句做什么,或者它与这个答案或你的原始问题有什么关系。也许这应该是一个新问题。当有人试图预订下个月的房间时,知道一个房间现在是否被占用有什么好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多