【问题标题】:Checking available room resevation between check-in and check-out date with SQL in ASP.net在 ASP.net 中使用 SQL 检查入住和退房日期之间的可用房间预订情况
【发布时间】:2019-04-16 20:11:55
【问题描述】:

我可以在如何创建我的选择语句时使用一些建议,以便它适用于入住和退房日期。我有 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.

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

签入和签出的数据类型是“日期”DD/MM/YYY” 假设房间 101 在 2015 年 7 月 13 日和 2015 年 7 月 15 日之间预订。然后表格将如下所示。

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

那么,如果用户在日期中写入:14-07-2015 和 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),尝试使用“日期”数据类型,但随后出现以下错误 “从字符串转换日期和/或时间时转换失败。” em>

这里重要的是,如果您尝试预订房间并且入住或退房日期是 2015 年 7 月 7 日至 2015 年 7 月 20 日之间的日期,那么房间 102 已被预订,不应显示出来。

【问题讨论】:

  • 发布样本数据和所需的输出@raaydk
  • 它应该选择什么?
  • 我已经更新了 :)
  • 您自己尝试过什么吗?到目前为止你做了什么?如果你不这样做,你为什么指望这里的人为你做所有的工作?
  • 我自己尝试了很多..

标签: sql asp.net


【解决方案1】:
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)
    )
)

【讨论】:

  • WHERE NOT EXISTS 是什么意思?
  • @Raaydk:它会选择所有可用的房间,因为它排除了当时保留的所有房间。 NOT EXISTS 不包括保留。
  • @Raaydk:但我对它进行了一些编辑。如果没有样本数据,它仍然有点令人困惑。我希望你明白逻辑。
  • 是的,我正在努力做到这一点:)
  • @Raaydk:我当前的版本应该这样做,我首先使用了该参数,因为它更具可读性。 @CheckIn 是请求的日期,b.CheckIn 是已经保留的签到日期。
【解决方案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
    )
)

【讨论】:

  • 已经尝试过你的代码,但它也不起作用..它检索所有房间而不是让房间 102 不在桌子上。
  • @Raaydk 我需要查看您使用的实际代码和示例数据以查看您的错误在哪里,除非您的日期字段存储为字符串,在这种情况下您需要先将它们转换为日期类型你检查他们。
  • 现已更新.. 看看。这行 b.RoomNumber = r.RoomNumber.. 也是正确的,因为它应该得到所有未保留的房间。
  • 除非您在进行比较之前将所有日期转换为日期类型,否则这将不起作用
  • 是的..我使用了 CAST 并将格式从 DD/MM/YYYY 更改为 YYYY/MM/DD 并且有效!非常感谢...
【解决方案3】:
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

【讨论】:

  • 还有其他答案提供了 OP 的问题,它们是多年前发布的。发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答较旧的问题时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多