我正在预订导游系统。 在此之前有人抱怨这个问题是这个问题的一个共同点:Help with SQL query to find next available date for a reservation system我想指出我不想使用日历表。
一些基本信息:
预订表结构:
CREATE TABLE IF NOT EXISTS `reservations` ( `id` int(11) NOT NULL AUTO_INCREMENT, `guider_id` int(11) NOT NULL, `date` datetime NOT NULL, `duration` int(11) NOT NULL, PRIMARY KEY (`id`), ) ;
userStartDateTime =用户在中选择的开始日期和时间 预订系统userEndDateTime =用户的开始日期和时间 选择预订系统+持续时间
参观的最短持续时间为15分钟。
这是交易: 客户来到预订系统。他们选择日期和时间,持续时间和范围,以防选择的日期/时间不再可用。
我们有不同的指南,但总是相同的游览只是因为他们采取的持续时间和看到的地方(此时无关紧要)不同。所以预订可以超过一定程度。每个导游都可以在每天24小时,每天24小时开放。 但每次巡演后都会有5分钟的缓冲时间,以避免延误。
我通过将巡视的持续时间添加到开始时间来生成结束日期。 我在预订表中搜索所有带有BETWEEN where子句的指南,如下所示:
SELECT guider_id FROM reservations as r
WHERE
(((r.startDateTime - interval 5 minute) BETWEEN userStartDateTime AND userEndDateTime)) OR
((r.startDateTime + interval r.duration minute + interval 5 minute) BETWEEN userStartDateTime AND userEndDateTime))
之后我在指南表上使用“NOT IN”找到可用的指南(就像每个指导者每天都可以提到的那样)。如果我找到一个:是的,保留成功。如果不是......我需要找一个可用的日期/时间。
这就是我被困的地方。 我不想创建一个存储每个可用日期时间组合的表,因为这是一个内存浪费的地狱,意味着很多工作和性能。因为每天的每个时间都可以选择。这意味着,每次预订我需要重新安排当天的整个桌子。该表将持有一天和一年(假设为360天)的1440个条目518400.要填写该表以用于即将到来的十年......您可以自己计算。这甚至都不值得考虑。
所以我现在需要做的是:我需要在userStartDateTime范围内找到一个新的日期/时间。首先向前(首选),如果没有找到任何自由导向器那么向后发现。
那我怎么能这样做?
我对此没有任何有用的想法。 只是将范围添加到我计算的结束日期是行不通的,因为它会吸引很多导游开始并在其中完成巡视。
问候 func0der
答案 0 :(得分:1)
如何创建名为scheduledTour的新表(仅作为示例)。然后只需在需要添加新的导览时更新表格,或者删除一个。因此,基本上,当首先制作表格时,它将完全为空。
scheduledTour表将包含以下信息:tour_id,guider_id,customer_id,startDateTime,endDateTime。
tour_id只是一个自动增量INT值,可用于保持条目唯一。 guider_id是你在问题中提到的那个,它将从你已经拥有的表中引用指定的指南,并且与customer_id相同(如果你有一个客户表。如果不是,你可以替换w /票号,名称等)。
这种方式对预定的游览次数没有限制,您可以轻松创建添加/删除页面。您可以为具体的导游,所有旅行团或具有特定开始和结束日期/时间的旅行团提供旅行。
此外,如果所有旅行都有5分钟。缓冲区,然后在创建游览时将其添加到开始和结束时间。
例如,在您输入日期之后的“更新”声明中:
... DATE_ADD([startDateTime], INTERVAL 5 MINUTE) ...
希望这有帮助!