使用ASP.net中的SQL检查签入和签出日期之间的可用房间重新设置

问题描述 投票:-1回答:3

我可以在如何创建我的select语句时使用一些建议,因此它将与签入和签出日期一起使用。我有2张桌子:房间和预订。为了帮助您理解,它们看起来像这样:

Rooms table:
Room number (prim-key)
Type
Price

Booking table:
BookingId (prim-key)
Check-In date:
Check-Out date:
Room-number (foreign key) to Room number in Room table.

我有一个Check available room按钮,它在我的gridview中运行select语句。根据用户的输入,它应该找到尚未预留的房间。

登记入住和退房的数据类型为“日期”DD / MM / YYYY“假设房间101是在13-07-2015和15-07-2015之间预订的。表格将如下所示。

BookingId = a long number  ,   Check-In = 13-07-2015  ,   Check-Out = 15-07-2015  ,  RoomNumber = 101.

那么,如果用户在日期中写道,我如何制作select语句:2015年4月14日也是16-07-2015?然后它不应该显示101室,因为它是保留的。

希望有人能指导我朝着正确的方向前进。如果您需要任何代码或东西,请告诉我!

更新:

我仍在努力使这项工作......不确定是什么导致我得到的问题。现在,当我运行Tim和Hogan的代码(尝试过两者)时,它将检索酒店中的所有房间,而不是对保留的特定房间进行排序。

如下图所示,102号房间已预订

用户在日期中写入的文本框代码:

 <div class="form-group">
    <asp:Label ID="CheckinLabel" runat="server" Text="Check-in Date"></asp:Label>
    <asp:TextBox ID="datetimepicker1" ClientIDMode="Static" runat="server" CSSclass="form-control"></asp:TextBox>
 </div>
 <div class="form-group">
    <asp:Label ID="CheckoutLabel" runat="server" Text="Check-out Date"></asp:Label>
    <asp:TextBox ID="datetimepicker2" ClientIDMode="Static" runat="server" CSSclass="form-control"></asp:TextBox>
    </div>

我的两张桌子的图片,所以你可以看到它们的样子:

CheckIn和CheckOut数据类型是:nchar(10),尝试使用“date”数据类型,但它给了我以下错误“从字符串转换日期和/或时间时转换失败”。

重要的是,如果您尝试预订房间并且登记入住或退房日期是2015年7月15日至2015年7月20日之间的日期,那么房间102已经预订,不应该显示。

sql asp.net
3个回答
2
投票

我认为Tim错过了一个案例 - 使用Between可能会使逻辑更清晰吗?

编辑:没关系,蒂姆是正确的 - 这是另一种方式。

案例 - 我们的签到或结账时间是在使用房间或我们办理登机手续和结账时使用房间时“环绕”。

SELECT r.*
FROM Room r
WHERE NOT EXISTS
(
    SELECT 1 FROM Booking b
    WHERE b.RoomNumber = r.RoomNumber 
    AND 
    (
         @Checkin BETWEEN b.CheckIn AND b.CheckOut OR
         @Checkout BETWEEN b.CheckIn AND b.CheckOut OR 
         (@Checkin <= b.CheckIn AND @CheckOut >= b.CheckPut
    )
)

4
投票
SELECT r.*
FROM Room r
WHERE NOT EXISTS
(
    SELECT 1 FROM Booking b
    WHERE b.RoomNumber = r.RoomNumber 
    AND 
    (
         (@CheckIn >= b.CheckIn AND @CheckIn  <= b.CheckOut)
      OR (@CheckIn <= b.CheckIn AND @Checkout >= b.CheckIn)
    )
)

0
投票
CREATE PROCEDURE [dbo].[SP_RoomAvailabilty_Bind]
(
    @RTId bigint=null,/*Room Type*/
    @CheckInDate DATE=null,/*Checkin Date*/
    @CheckOutDate DATE=null/*Checkout Date*/
)
AS
BEGIN

SELECT tbl_RoomMaster.RoomSN, tbl_RoomTypeMaster.RoomType
FROM tbl_RoomMaster INNER JOIN
tbl_RoomTypeMaster ON tbl_RoomMaster.RTId = tbl_RoomTypeMaster.RTId 
WHERE tbl_RoomMaster.RoomId NOT IN (SELECT RoomId FROM tbl_Reservation WHERE CheckInDate=@CheckInDate)
AND tbl_RoomMaster.RTId=@RTId

SELECT tbl_RoomTypeMaster.RoomType, tbl_RoomMaster.RoomSN,tbl_RoomMaster.RoomId
FROM  tbl_RoomMaster INNER JOIN
tbl_RoomTypeMaster ON tbl_RoomMaster.RTId = tbl_RoomTypeMaster.RTId
WHERE tbl_RoomMaster.RoomId NOT IN (SELECT RoomId FROM tbl_Reservation 
WHERE (CheckInDate BETWEEn  @CheckInDate AND @CheckOutDate)
 OR  (CheckoutDate between @CheckInDate AND @CheckOutDate))

END
© www.soinside.com 2019 - 2024. All rights reserved.