我需要能够检查用户提供的日期范围是否可用。我的数据库中有一个名为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
如果room_id
1共有8个可用空间,并且用户在2012-12-10
和2012-12-20
之间要求此房间,是否可以执行查询是否可以检查每天预订的SUM
个房间不超过8个。
我可以这样做的另一种方法是单独存储每一天,并改为使用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
这种方式会在数据库中占用更多空间,但可能会更容易。我该怎么办?如果第一个想法我将如何进行查询?还有其他更好的方法来实现我想要做的事情吗?
答案 0 :(得分: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。
答案 1 :(得分:0)
对于您的第一个选项,您始终可以使用this之类的功能。
然后你有一个这样的查询(我正在使用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
然而,如果这种做法是最好的,我不知道。我宁愿使用你的第二个选项,因为解释起来不那么复杂,我也不知道我是否需要另外一种查询。
答案 2 :(得分:0)
我建议每个房间的每个预订日都有一排。
使用该结构,每个可能的计算都更容易。是的,您将在表格中拥有更多数据的缺点,但它不会像您想象的那样影响您的数据库。我认为大多数查询都会更快,因为你会避免使用日期进行复杂的计算。
所以这是第二种方法的专业人士: