Php 搜索给定范围内没有日历表的可用日期

Php 搜索给定范围内没有日历表的可用日期,php,mysql,sql,Php,Mysql,Sql,我使用导游预订系统。 在任何人抱怨这个问题之前,我想指出,我不想使用日历表 一些基本信息: 预订表结构: 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`),

我使用导游预订系统。 在任何人抱怨这个问题之前,我想指出,我不想使用日历表

一些基本信息:

预订表结构:

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/7都有空。 但每次旅行后都有5分钟的缓冲时间,以避免延误

我通过将巡演的持续时间添加到开始时间来生成结束日期。 我在“预订”表中搜索所有带中间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))
之后,我在guiders表中使用“NOT IN”来查找可用的guiders(如前所述,每天的每个时间都有可用的guider)。如果我找到一个:是的,预订成功。如果没有…我需要找到一个可用的日期/时间

这就是我受挫的地方。 我不想创建一个存储所有可用日期-时间组合的表,因为这是一个巨大的内存浪费,意味着大量的工作和性能。因为一天中的每一个时间都是可以选择的。也就是说,每次预订我都需要重新安排当天的整个桌子。该表将在一天和一年内(假设360天)容纳1440个条目518400个。为了填满未来十年的表格…你可以自己计算。这甚至不值得考虑

所以我现在需要做的是:我需要在userStartDateTime的范围内找到一个新的日期/时间。首先向前(首选),如果从该位置向后找不到自由导向器

那我该怎么做呢

我只是不知道该怎么做。 仅仅在我计算的结束日期上加上这个范围是行不通的,因为它会吸引很多导游,他们有一个旅行的开始和结束时间

问候
func0der

创建一个名为scheduledTour的新表怎么样(仅举个例子)。然后,只要在需要添加或删除新导览时更新表即可。因此,基本上,当桌子第一次被制作时,它将是完全空的

scheduledTour表将包含如下信息:tour_id、guider_id、customer_id、startDateTime、endDateTime

tour_id只是一个自动递增的INT值,可以用来保持条目的唯一性。guider_id是您在问题中提到的,它将引用您已经拥有的表中指定的guider,客户id也是如此(如果您拥有客户表,则可以替换w/票号、名称等)

通过这种方式,您可以轻松地创建一个添加/删除页面,对计划的旅行次数没有限制。您可以为特定导游、所有导游或带有特定开始和结束日期/时间的导游拉取导游

另外,如果所有的旅行都有5分钟的时间。缓冲区,然后在创建巡更时将其添加到开始和结束时间

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

... DATE_ADD([startDateTime], INTERVAL 5 MINUTE) ...
希望这有帮助

  • “日期添加()

日历文件(仅填充日期)是一件有用的事情,我不建议创建它。除此之外,通常建议避免在之间使用(尤其是日期/时间/时间戳),而是使用一个排他性的上限。我认为,这是一种倒退——与其寻找你没有指南的时间,不如找一个有足够时间的指南;执行差距分析,以找到所有持续时间足够长的差距(在指定范围内,您必须为上限日期生成“幻影”条目),并按原始/所需开始时间的绝对间隔排序。mySQL没有CTE,所以我不想麻烦写这个…好的。我不支持mysql。所以我想请你们解释一下“排他性上限”和“CTE”。你有没有关于“差距分析”的例子?排他性上界用于避免一对一的错误,尤其是在日期方面-以获取指定月份内的所有日期:
其中dateCol>=@monthStart和dateCol<@monthStart+1个月
-这比尝试查找月末问题更少,与时间戳更相关。CTE(Common Table Expressions)基本上是创建内联临时表,提取到单个引用中-最接近的mySQL是
SELECT*FROM(SELECT…
)-除了我只需声明一次内部SELECT,但可以多次引用它之外。在这方面可以找到一个很好的差距分析示例,以及答案。不幸的是,mySQL可能没有更好的功能来使用。。。另外,请注意,这种类型的分析本质上是“昂贵的”——在这种情况下,你无法回避。