更改特定日期范围的布尔值

时间:2012-05-03 08:33:34

标签: sql-server

您好我正在使用ASP.NET中的酒店预订项目。我想制作一个过滤器,以便我可以按日期(例如6月1日到6月5日)搜索可用的房间,然后保留那个房间。我怎样才能将该房间的状态更改为“不可用”期间,所以想要在15和50之间保留那个房间的人可以这样做。房间的状态在我的数据库中是布尔值。

enter image description here

到目前为止,我显示所有状态可用的房间。但是当我在数据库中引入房间时设置状态。但是我不知道如何更改状态以及是否可以将房间的状态设置为真期间,然后假期为另一个期间

3 个答案:

答案 0 :(得分:0)

首先,您的数据库结构不正确。您必须在预订表中具有状态字段,以便您明天拥有过渡历史记录。

因为在您目前的情况下,您的房间将全天可用,或者它将全天关闭。您应该制作一个房间状态表,在该表中您应该记录日常状态,并根据该表确认您的房间选择。

将状态的默认值设为true。因此,默认情况下,每个房间都可以预订。

@ianco slovak,我真的觉得你必须改变你的数据库结构。

答案 1 :(得分:0)

[状态]字段的目的是显示现在房间是否可用,不是吗? 如果是,则可以将其设置为Computed - 创建一个sql函数,该函数返回boolean(Status字段的类型)并检查当前时刻没有预留。

请详细了解有关计算字段here以及有关效果here

的信息

答案 2 :(得分:0)

您要求的内容不需要更改数据库结构,并且为了支持MarkP3rry描述的超时功能,您只需要在Reservation表中添加一个字段:BookingDate DATETIME。您应该使用预订表检查可用性。如果没有对与提供的开始和结束日期重叠的房间进行预订,则该房间可用于该期间,除非预订已被取消。

要确定两个日期之间可用的房间,请使用以下查询:

SELECT r.*
FROM Room r LEFT JOIN Reservation v ON r.RoomID = v.RoomID
    AND NOT (@StartDate >= Date_Check_Out OR @EndDate <= Date_Check_In)
    AND v.cancel = 0
WHERE v.ReservationID IS NULL

这将为您提供@StartDate@EndDate之间无保留的所有房间。您当然可以根据房间状态,房间类型等对此进行过滤。此查询假定已完成对提供日期的验证,即@StartDate < @EndDateReservation.Check_In_Date < Reservation.Check_Out_Date。联接将返回所有房间,并且仅返回其日期与提供的开始日期和结束日期重叠的预订。添加AND v.cancel = 0仅包含尚未取消的预订。然后,我们过滤掉包含任何预订数据的结果,剩下的是两个日期之间的可用房间。