帮助编写大厅预订日期可用性搜索查询

Posted

技术标签:

【中文标题】帮助编写大厅预订日期可用性搜索查询【英文标题】:Help in writing Query for hall booking date availability search 【发布时间】:2009-10-21 10:56:48 【问题描述】:

我需要帮助编写查询以查找大厅预订系统的可用时间段。详细信息如下

我有一个存储大厅详细信息的 Hall 表和一个存储预订完成时间的 HallBooking 表。

大厅 - HallId - 名称

大厅预订 - HallBookingId - HallId - BookingPersonName - 开始日期时间 - 结束日期时间

用户可以通过指定开始日期时间和结束日期时间来搜索大厅可用性。查询应该选择并显示大厅在那个时间是否可用。

如果时间段不可用,则查询应选择当天具有相同持续时间的可用时间段并显示给用户。

提前致谢 安兹

【问题讨论】:

【参考方案1】:

这是一个可以帮助您入门的测试脚本。

DECLARE @Hall TABLE
    (
      HallID INT PRIMARY KEY ,
      HallName VARCHAR(1)
    )
DECLARE @HallBooking TABLE
    (
      HallBookingID INT PRIMARY KEY ,
      HallID INT ,
      BookingPersonName VARCHAR(10) ,
      StartDateTime DATETIME ,
      EndDateTime DATETIME
    )


INSERT  @Hall
        SELECT  1 ,
                'A'
        UNION ALL
        SELECT  2 ,
                'B'
        UNION ALL
        SELECT  3 ,
                'C'


--TEST 1 Check for available Hall
DECLARE @HallID INT ,
    @StartDateTime DATETIME ,
    @EndDateTime DATETIME
DECLARE @Status VARCHAR(6)

SELECT  @HallID = 1 ,
        @StartDateTime = '20091021 8:00:00' ,
        @EndDateTime = '20091021 12:00:00'


--INSERT TestReservationCode here

SELECT  @Status = 'Open'
FROM    @Hall h
WHERE   h.HallID = @HallID
        AND NOT EXISTS ( SELECT *
                         FROM   @HallBooking hb
                         WHERE  h.HallID = hb.HallID
                                AND ( @StartDateTime >= hb.StartDateTime
                                      AND @StartDateTime < hb.EndDateTime
                                      OR @EndDateTime > hb.StartDateTime
                                      AND @EndDateTime <= hb.EndDateTime
                                    ) )


IF @Status IS NULL 
    BEGIN

        SELECT  @Status = 'Closed'

        SELECT  *
        FROM    @Hall h
        WHERE   h.HallID <> @HallID
                AND NOT EXISTS ( SELECT *
                                 FROM   @HallBooking hb
                                 WHERE  h.HallID = hb.HallID
                                        AND ( @StartDateTime >= hb.StartDateTime
                                              AND @StartDateTime < hb.EndDateTime
                                              OR @EndDateTime > hb.StartDateTime
                                              AND @EndDateTime <= hb.EndDateTime
                                            ) )


    END


SELECT  @Status

要测试预订状态,请在上面的 INSERT 注释下方插入以下代码并重新运行。

--TestReservationCode
INSERT  INTO @HallBooking
        ( HallBookingID ,
          HallID ,
          BookingPersonName ,
          StartDateTime ,
          EndDateTime
        )
VALUES  ( 1 , -- HallBookingID - int
          1 , -- HallID - int
          'Stuart' , -- BookingPersonName - varchar(10)
          '2009-10-21 10:00' , -- StartDateTime - datetime
          '2009-10-21 12:00'  -- EndDateTime - datetime
        )

INSERT  INTO @HallBooking
        ( HallBookingID ,
          HallID ,
          BookingPersonName ,
          StartDateTime ,
          EndDateTime
        )
VALUES  ( 2 , -- HallBookingID - int
          2 , -- HallID - int
          'Stuart' , -- BookingPersonName - varchar(10)
          '2009-10-21 10:00' , -- StartDateTime - datetime
          '2009-10-21 12:00'  -- EndDateTime - datetime
        )

【讨论】:

以上是关于帮助编写大厅预订日期可用性搜索查询的主要内容,如果未能解决你的问题,请参考以下文章

获取范围之间的日期时出现问题

用于检查房间可用性的 SQL 查询

查询可预订的车辆

PHP/MySQL 中的预订日期可用性范围

我想通过检查预订日期或即将到来的日期的时间段可用性来更新我的会议室预订表

应用引擎数据存储中的可用性日期范围查询?