从数据库处理多个日期对(开始,结束)

时间:2016-07-02 18:32:21

标签: sql database date database-design sqlite

我有一个酒店预订系统。

我有一张桌子房间有两个基本栏目: -

  1. Room_No(主键)
  2. AVAILABLE_FROM_DATE(日期)
  3. 我有以下参数的预订请求: -

    1. Booking_ID
    2. Booking_start_date(日期)
    3. Booking_end_date(日期)
    4. 因此,对于每次预订,我都需要检查booking_start_date和booking_end_date中是否有空房。立即使用以下查询: -

      SELECT Room_No 
      FROM Rooms 
      WHERE AVAILABLE_FROM_DATE >= booking_start_date 
      AND AVAILABLEFROMDATE < booking_end_date;
      

      如果可用,那么我需要将该空间分配给该特定start_date,end_date对的特定Booking_ID。

      我需要在Rooms表中为该特定room_no更新相同的信息,以便在特定日期范围内不会预订两次房间。 目前我这样做是将AVAILABLE_FROM_DATE列更新为booking_end_date + 1

      问题在于当前实现我只能跟踪一个日期范围。

      因此,如果我的房间从1月1日起可用,预订于2月1日至2月10日,我将AVAILABLE_FROM_DATE更新为2月11日。 所以对于另一个预订,比如说1月1日 - 1月31日,虽然我的房间可用,但我无法分配。

      有什么方法可以记录我的房间可用的所有日期范围,以便我可以更好地分配房间。

      我正在考虑制作一个单独的表来存储每个Room_No的多个预订(开始,结束)日期范围,但是Rooms表可以非常大(最多5000行),所以我还需要注意效率。

      有关如何处理我的问题以实现最大分配的任何建议?

1 个答案:

答案 0 :(得分:0)

首先,一张包含5000条记录的表格并不大。 其次,我看到了设计缺陷。鉴于您的数据结构,它似乎无法实现您所要求的。

AVAILABLE_FROM数据是一份报告 - 有人会在某天向你的系统询问某个房间是否有其他日期可用。因此,报告不应仅保存在字段中,以便随后显示此数据。相反,请松开报告字段AVAILABLE_FROM并在Bookings表中添加指向Rooms表的外键。接下来,在您的代码中,当有人预订时,将房间ID添加到预订中(听起来很自然,不是吗?)。稍后当有人询问系统是否有特定房间可用时,或者在您另外预订之前,您需要运行查询以查看该房间是否已经预订了该期间;像这样的东西:

SELECT TOP 1 1
FROM Bookings
WHERE RoomId = room_of_interest 
    AND Booking_start_date > 'start_date_criteria' AND Booking_end_date < 'end_date_criteria'

如果此查询返回1,显然该时段内的房间不可用。