0

我需要能够检查用户给出的日期范围是否可用。我的数据库中有一个名为的表booked,其中包含开始日期、结束日期以及在此期间已预订的房间数量。

假设我的booked表如下所示:

room_id | start      | end        | amount_of_rooms_booked
1       | 2012-12-12 | 2012-12-15 | 2
1       | 2012-12-13 | 2012-12-16 | 3
1       | 2012-12-18 | 2012-12-19 | 1

如果 1 总共有 8 个房间,并且用户在和room_id之间要求这个房间,是否可以进行查询,检查每天预订的房间是否不超过 8 个。2012-12-102012-12-20SUM

我可以这样做的另一种方法是单独存储每一天,并使用这样的booked表格:

room_id | start      | amount_of_rooms_booked
1       | 2012-12-12 | 2
1       | 2012-12-13 | 5
1       | 2012-12-14 | 5
1       | 2012-12-15 | 3
1       | 2012-12-18 | 1

这种方式会在数据库中使用更多空间,但可能会更容易。我应该做什么?如果第一个想法我将如何进行查询?还有其他更好的方法来实现我想要做的事情吗?

4

3 回答 3

0

要回答你原来的问题,你会这样做:

SELECT SUM(amount_of_rooms_booked) FROM booked
WHERE (start BETWEEN '2012-12-10' AND '2012-12-20' OR
       end BETWEEN '2012-12-10' AND '2012-12-20')
AND room_id = 1

我认为您存储它的方式很好,尽管我可能会在每个房间预订中存储一行,而不是带有“amount_of_rooms_booked”列的行。那么上面的查询将是一个 COUNT 查询而不是一个 SUM。

于 2013-01-05T20:15:02.770 回答
0

对于您的第一个选项,您始终可以使用这样的函数

然后你有一个这样的查询(我正在使用 SQL Server),它返回在给定日期预订少于 8 个的房间:

SELECT D.theDate, SUM(amount_of_rooms_booked) AS [amount_of_rooms_booked]
FROM
          booked
INNER JOIN
          dbo.ExplodeDates('20121210','20121220') D ON D.thedate BETWEEN booked.start AND booked.end
WHERE
          booked.room_id = @room
GROUP BY
          booked.room_id, D.thedate
HAVING
          SUM(amount_of_rooms_booked) < @bookingLimit

但是,如果这种做法是最好的,我不知道。我宁愿使用您的第二个选项,因为解释起来不太复杂,而且我永远不知道我是否需要另一种查询。

于 2013-01-05T22:08:59.593 回答
0

我建议在每个房间的每个预订日排一排。

使用这种结构,每个可能的计算都变得更容易。是的,您会遇到表中有更多数据的缺点,但它不会像您想象的那样影响您的数据库。我认为大多数查询会更快,因为您将避免使用日期进行复杂的计算。

所以这是我对第二种方法的优点:

  • 它符合用户的思维模式(大部分)
  • SQL更简单!更快(大部分)
  • 更容易维护
  • 更容易保持数据清洁(可能)
于 2013-01-10T14:19:07.210 回答