Sql 酒店客房预订声明

Sql 酒店客房预订声明,sql,database-design,Sql,Database Design,基本上,我正在为我的计算机a级课程制作一个基本的酒店预订系统,但遇到了一个绊脚石(也无助于偏头痛!) 我正在检查是否有房间可供用户预订(顺便说一句,该应用程序都是由员工运行和使用的),但我想弄清楚怎么做 当时我在想,我可以在当前的预订数据库中搜索我想预订的房间号和日期,如果有匹配的结果,这意味着某个房间被预订了。那很好,但是我怎么告诉它日期的范围呢?(抱歉,问了个糟糕的问题)我在想sql语句的伪代码版本,行为: 如果“数据库中已存在预订的签入日期”早于 “新预订的入住日期”和“已预订的退房日期”

基本上,我正在为我的计算机a级课程制作一个基本的酒店预订系统,但遇到了一个绊脚石(也无助于偏头痛!)

我正在检查是否有房间可供用户预订(顺便说一句,该应用程序都是由员工运行和使用的),但我想弄清楚怎么做

当时我在想,我可以在当前的预订数据库中搜索我想预订的房间号和日期,如果有匹配的结果,这意味着某个房间被预订了。那很好,但是我怎么告诉它日期的范围呢?(抱歉,问了个糟糕的问题)我在想sql语句的伪代码版本,行为:

如果“数据库中已存在预订的签入日期”早于 “新预订的入住日期”和“已预订的退房日期” 在数据库中,在“新预订的入住日期”之后,则房间为 已经预订了

基本上,如果它返回一个记录,那么我知道房间被预订了。但我只需要弄清楚如何使用SQL根据我的签入/签出日期搜索记录


但这将允许双重预订,啊,这让我发疯了:/有什么想法吗?

建议的伪代码只考虑了现有预订和新预订之间发生冲突的一种可能性。为了说明,考虑一个房间有一个预订。

         |======================|
      Check-in date        Check out date
假设我们想要创建一个新预订,并且有4个潜在的新预订

         |======================|       Existing booking

      |-----------------------------|   New booking (Scenario 1)
   |----------|                         New booking (Scenario 2)
                        |-------------| New booking (Scenario 3)
|---|                                   New booking (Scenario 4)
其中,只有场景4不与现有预订重叠;其他与现有预订冲突。虽然伪代码处理场景1,但它不会检测场景2或3,因此将允许双重预订

         |======================|       Existing booking

      |-----------------------------|   New booking (Scenario 1)
   |----------|                         New booking (Scenario 2)
                        |-------------| New booking (Scenario 3)
|---|                                   New booking (Scenario 4)
实际上,您的伪代码可能是这样的

Let E = booking already on the database
    N = new booking,
    CID = check-in date,
    COD = check-out date

For a new booking N, N conflicts with an existing booking iff there exists a record E where:
  (CID of E is between CID of N and COD of N), or
  (COD of E is between CID of N and COD of N), or
  (CID of N < CID of E and COD of N > COD of E)
Let E=已在数据库中预订
N=新预订,
CID=入住日期,
COD=退房日期
对于新预订N,N与现有预订iff冲突,存在记录E,其中:
(E的CID介于N的CID和N的COD之间),或
(E的COD介于N的CID和N的COD之间),或
(N的CIDE的COD)
在SQL中,根据您的模式,查询可能类似于以下内容:

-- assume @new_cid is the new checkin date and @new_cod is the new checkout date
select count(*) from bookings
where
@new_cid between bookings.checkindate and bookings.checkoutdate or
@new_cod between bookings.checkindate and bookings.checkoutdate or
(@new_cid <= bookings.checkindate AND @new_cod > bookings.checkoutdate)
——假设@new\u cid是新签入日期,@new\u cod是新签出日期
从预订中选择计数(*)
哪里
@预订.签入日期和预订.签出日期或
@预订之间的新cod。签入日期和预订。签出日期或
(@new_cid bookings.checkoutdate)

建议的伪代码仅考虑现有预订和新预订之间存在冲突的一种可能性。为了说明,考虑一个房间有一个预订。

         |======================|
      Check-in date        Check out date
假设我们想要创建一个新预订,并且有4个潜在的新预订

         |======================|       Existing booking

      |-----------------------------|   New booking (Scenario 1)
   |----------|                         New booking (Scenario 2)
                        |-------------| New booking (Scenario 3)
|---|                                   New booking (Scenario 4)
其中,只有场景4不与现有预订重叠;其他与现有预订冲突。虽然伪代码处理场景1,但它不会检测场景2或3,因此将允许双重预订

         |======================|       Existing booking

      |-----------------------------|   New booking (Scenario 1)
   |----------|                         New booking (Scenario 2)
                        |-------------| New booking (Scenario 3)
|---|                                   New booking (Scenario 4)
实际上,您的伪代码可能是这样的

Let E = booking already on the database
    N = new booking,
    CID = check-in date,
    COD = check-out date

For a new booking N, N conflicts with an existing booking iff there exists a record E where:
  (CID of E is between CID of N and COD of N), or
  (COD of E is between CID of N and COD of N), or
  (CID of N < CID of E and COD of N > COD of E)
Let E=已在数据库中预订
N=新预订,
CID=入住日期,
COD=退房日期
对于新预订N,N与现有预订iff冲突,存在记录E,其中:
(E的CID介于N的CID和N的COD之间),或
(E的COD介于N的CID和N的COD之间),或
(N的CIDE的COD)
在SQL中,根据您的模式,查询可能类似于以下内容:

-- assume @new_cid is the new checkin date and @new_cod is the new checkout date
select count(*) from bookings
where
@new_cid between bookings.checkindate and bookings.checkoutdate or
@new_cod between bookings.checkindate and bookings.checkoutdate or
(@new_cid <= bookings.checkindate AND @new_cod > bookings.checkoutdate)
——假设@new\u cid是新签入日期,@new\u cod是新签出日期
从预订中选择计数(*)
哪里
@预订.签入日期和预订.签出日期或
@预订之间的新cod。签入日期和预订。签出日期或
(@new_cid bookings.checkoutdate)

一开始可能看起来不太明显,但实际上,您可以简化对完全或部分日期重叠的测试,只需两个条件

假设您有一张包含现有预订的
预订
表,以及一张包含入住日期
@new\u check\u in
和退房日期
@new\u check\u out
的新预订。要查找与这些日期重叠的所有预订(假设终点包括在内),您只需使用此类where子句:

--Select overlapping bookings
-- ...
WHERE BOOKING.CHECK_IN <= @NEW_CHECK_OUT
  AND BOOKING.CHECK_OUT >= @NEW_CHECK_IN
-- ...
——选择重叠预订
-- ...
WHERE BOOKING.CHECK\u IN=@NEW\u CHECK\u IN
-- ...

我知道这看起来太简单了,但请尝试一下drf演示的场景(加上错过的三个场景,(1)新预订在现有预订之后,(2)新预订严格在现有预订范围内,(3)新预订与现有预订相等)。您将看到,这组简单的条件涵盖了所有这些场景。

开始时,它可能看起来并不完全明显,但实际上,您可以使用仅两个条件简化对完整或部分日期重叠的测试

假设您有一张包含现有预订的
预订
表,以及一张包含入住日期
@new\u check\u in
和退房日期
@new\u check\u out
的新预订。要查找与这些日期重叠的所有预订(假设终点包括在内),您只需使用此类where子句:

--Select overlapping bookings
-- ...
WHERE BOOKING.CHECK_IN <= @NEW_CHECK_OUT
  AND BOOKING.CHECK_OUT >= @NEW_CHECK_IN
-- ...
——选择重叠预订
-- ...
WHERE BOOKING.CHECK\u IN=@NEW\u CHECK\u IN
-- ...

我知道这看起来太简单了,但请尝试一下drf演示的场景(加上错过的三个场景,(1)新预订在现有预订之后,(2)新预订严格在现有预订范围内,(3)新预订与现有预订相等)。您将看到,这组简单的条件涵盖了所有这些场景。

我将试一试,但您已经准确地解释了我想要表达的内容!对不起,我的尝试糟透了