在没有日历表的情况下搜索给定范围内的可用日期

时间:2012-02-02 22:00:12

标签: php mysql sql

我正在预订导游系统。 在此之前有人抱怨这个问题是这个问题的一个共同点: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

1 个答案:

答案 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) ...

希望这有帮助!