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

标签 php mysql sql

我正在使用导游预订系统。 在有人提示这个问题与此问题重复之前:Help with SQL query to find next available date for a reservation system我想指出的是,我不想使用日历表。

一些基本信息:

Reservation table structur:

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 = the start date and time the user choose in the reservation system userEndDateTime = the start date and time the user choose in the reservation system + the duration

Minimum duration for a tour is 15 minutes.

交易如下: 顾客来到预订系统。他们选择日期和时间、持续时间和范围,以防所选日期/时间不再可用。

我们有不同的导游,但总是相同的旅行,只是他们所花费的时间和参观的地方不同(目前这并不重要)。因此,保留意见可能会超出一定程度。每位导游全天候 24/7 全天候提供服务。 但每次游览后有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”来查找可用的指南(就像前面提到的,每个指南在一天中的每个时间都可用)。如果我找到一个:是的,预订成功。如果没有......我需要找到一个可用的日期/时间。

这就是我被困住的地方。 我不想创建一个存储每个可用日期时间组合的表,因为这会浪费大量内存,并且意味着大量工作和性能。因为一天中的每个时间都可以选择。这意味着,每次预订时我都需要重新安排当天的整张 table 。该表已包含一天 1440 个条目,一年(假设 360 天)518400 个条目。要在未来十年填充该表......您可以自己计算。这甚至不值得考虑。

所以我现在需要做的是:我需要在 userStartDateTime 范围内找到一个新的日期/时间。首先向前(首选),如果没有找到自由引导者,则从那向后。

那么我该怎么做呢?

我对此没有什么可行的想法。 仅仅将范围添加到我计算的结束日期中是行不通的,因为它会吸引很多在其中开始和结束旅行的导游。

问候 函数0der

最佳答案

创建一个名为 ScheduledTour 的新表怎么样(仅作为示例)。然后,每当您需要添加新的导游或删除导游时,只需更新表格即可。因此,本质上,当第一次创建表格时,它会完全是空的。

scheduledTour 表包含以下信息:tour_id、guider_id、customer_id、startDateTime、endDateTime。

tour_id 只是一个自动递增的 INT 值,您可以使用它来保持条目的唯一性。 Guider_id 是您在问题中提到的那个,它将引用您已有的表中分配的指南,并且与 customer_id 相同(如果您有客户表。如果没有,您可以替换为票号、姓名等.).

这样,安排的游览数量就没有限制,并且您可以轻松创建添加/删除页面。您可以提取特定导游的游览、所有游览或带有特定开始和结束日期/时间的游览。

此外,如果所有游览都有 5 分钟时间。缓冲区,然后在创建游览时将其添加到开始和结束时间。

例如,在您输入的日期之后的“UPDATE”语句中:

... DATE_ADD([startDateTime], INTERVAL 5 MINUTE) ...

希望这有帮助!

关于php - 在没有日历表的情况下搜索给定范围内的可用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9120648/

相关文章:

php - 在线酒店预订系统,同时预订?

php - 人们注册时如何防止重复的用户名?

php - 从一个 PHP 变量中获取另一个变量的百分比

php - 将另一个表中的字段添加到结果

sql - 如何使用单个查询将记录导出到oracle10g中的文本文件?

sql - 仅使用 sql 解析表达式\查找表达式值的顺序

php - 如何在 gii 中使用自定义模板(使用 Yii 2)

mysql - 从日历表中加入缺失的日期

MySQL INDEXES - 将多列添加到一个索引

python - 无法使用输入作为名称在 Python 中创建 SQL 表