PHP 预约预约可用时间段

Posted

技术标签:

【中文标题】PHP 预约预约可用时间段【英文标题】:PHP Appointment Booking Available Time Slots 【发布时间】:2015-08-11 01:25:55 【问题描述】:

我正在为一位客户开发一个在线预约系统,我需要在该系统中找到他们的客户可以选择预约下一次预约的可用预约时间。

我将尝试解释当前的数据库设置:

表名称:appointments - 这些是客户当前预订的约会。

+----+---------+------------+-----------+------ ----+--------------+------+------------+
|编号 |工作人员 |日期 |开始时间 |结束时间 |客户名 |房间 |治疗 |
+----+----------+------------+------------+--------- -+--------------+------+------------+
| 1 | 2 | 2015-08-24 | 09:00:00 | 10:00:00 |史密斯先生 | 1 | 1 |
| 2 | 2 | 2015-08-24 | 11:00:00 | 12:00:00 |琼斯先生 | 2 | 1 |
+----+----------+------------+------------+--------- -+--------------+------+------------+

表格名称:staff - 员工列表、他们工作的星期几以及相关日期轮班的开始和结束时间。

+----+------+------------+-----------+---------- +
|编号 |姓名 |星期几|开始时间 |结束时间 |
+----+------+------------+------------+---------+
| 1 |菲尔 | 1 | 09:00:00 | 17:00:00 |
| 2 |丽莎 | 5 | 09:00:00 | 18:00:00 |
| 3 |丽莎 | 3 | 09:00:00 | 17:00:00 |
| 4 |鲍勃 | 5 | 15:00:00 | 17:00:00 |
+----+------+------------+------------+---------+上一页>


表名:治疗 - 可用治疗的列表

+----+-------------+----------+
|编号 |姓名 |持续时间 |
+----+-------------+----------+
| 1 |治疗 1 | 01:30:00 |
| 2 |治疗 2 | 01:00:00 |
+----+-------------+----------+

表名:stafftreatments - 一个查找表,用于确定哪些员工进行了哪些治疗。

+----+-------+------------+
|编号 |员工 |治疗 |
+----+-------+------------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
+----+-------+------------+

因此,我们可以假设治疗 1 由工作人员 Lisa 执行,但 Lisa 仅在周三上午 9 点至下午 5 点和周五上午 9 点至下午 6 点工作。 Phil 也可以执行治疗 1,但只能在星期一的上午 9 点到下午 5 点之间工作。

在我的应用程序中,我询问用户他们希望预订什么治疗。例如,治疗 1 持续 90 分钟。然后,客户将选择他们希望预约的日期。所以在这个阶段,我们知道所需约会的时间长度和日期,然后是星期几。

我将选择选定的日期并在接下来的 5 天里每天循环

我一直在尝试开发一个查询,该查询允许我根据包含预先预订的约会的约会表显示客户可以选择的所有可用时间段。

假设客户想要在 8 月 24 日预订治疗 1。我们知道一周中的某一天是星期五,所以应该是 5,我们知道丽莎在星期五的上午 9 点到下午 6 点之间工作,但她已经在上午 9 点到下午 12 点之间进行了预约。

因为治疗是 90 分钟,所以我需要最终得到以下数据:

+---------+--------+----------------+---------- ----+
|日期 |员工 |可用开始 |可用结束 |
+----------+--------+----------------+------------- -+
| 24/08/15 |丽莎 | 12:00 | 13:30 |
| 24/08/15 |丽莎 | 13:30 | 15:00 |
| 24/08/15 |丽莎 | 15:00 | 16:30 |
| 24/08/15 |丽莎 | 16:30 | 18:00 |
| 24/08/15 |鲍勃 | 15:00 | 16:30 |
+----------+--------+----------------+------------- -+

但是,下一个问题是只有 4 个房间可用,因此不能同时预订超过 4 个治疗。

我看到了这个帖子 - Finding free blocks of time in mysql and php?

但我的退休稍微复杂一些,我不确定如何构建查询。任何帮助将不胜感激。

对结构做了一些改动,我的查询如下:

SELECT trainer, day, bookingdate, from_time, to_time, 时间段
从
    (
    选择一个培训师
    , 一天
    , 预定日期
    , TIMEDIFF(start_time, IF(bookingdate=@prevdate,@prevend,open_time )) 作为时间段
    , IF(bookingdate=@prevdate,@prevend,open_time ) 作为 from_time
    , start_time 为 to_time
    , @prevend := end_time 作为 prevend
    , @prevdate := bookingdate 作为 prevdate
    从预订可用性
        JOIN (SELECT @prevend:=null,@prevdate:=null) 作为初始化
        INNER JOIN bookingscalendar c
            ON a.trainer = c.trainer
            AND WEEKDAY(c.bookingdate) = a.day

    联盟

      选择一个培训师
    , 日
    , 预定日期
    , TIMEDIFF(close_time, IFNULL(MAX(end_time),open_time) ) 作为时隙
    , IFNULL(MAX(end_time),open_time) 作为 from_time
    , close_time 为 to_time
    , null 作为预防
    , null 作为 prevdate
    从预订可用性
    LEFT JOIN bookingscalendar c
        ON a.trainer = c.trainer
        AND WEEKDAY(c.bookingdate) = a.day
    GROUP BY a.trainer,day,bookingdate
    ) 作为间隙
WHERE 时隙 > '00:00:00'
ORDER BY trainer, day, bookingdate, from_time;

使用以下数据:

+----+-------------+---------+------------+---- ------+-------------+------+------------+
|编号 |预订日期 |教练 |开始时间 |结束时间 |客户 ID |房间 |治疗 |
+----+-------------+---------+------------+------- ---+-------------+------+------------+
| 1 | 2015-08-24 | 2 | 15:00:00 | 16:00:00 |史密斯先生 | 1 | 1 |
| 2 | 2015-08-31 | 2 | 16:00:00 | 17:00:00 |琼斯先生 | 2 | 1 |

+-----------------+---------+-----+------------+ ------------+-------------+
|可用性_id |教练 |天 |开放时间 |关闭时间 |培训师姓名 |
+-----------------+---------+-----+------------+--- ----------+--------------+
| 4 | 1 | 2 | 09:00:00 | 17:00:00 |丽莎 |
| 6 | 1 | 4 | 09:00:00 | 17:00:00 |丽莎 |
| 7 | 1 | 5 | 09:00:00 | 17:00:00 |丽莎 |
+-----------------+---------+-----+------------+--- ---------+-------------+

返回的数据是:

+---------+-----+-------------+-----------+---- ------+----------+
|教练 |天 |预订日期 |从时间 |到时间 |时隙 |
+---------+-----+-------------+-----------+------- ---+------------+
| 1 | 2 |空 | 09:00:00 | 17:00:00 | 08:00:00 |
| 1 | 4 |空 | 09:00:00 | 17:00:00 | 08:00:00 |
| 1 | 5 |空 | 09:00:00 | 17:00:00 | 08:00:00 |
+---------+-----+-------------+-----------+------- ---+-----------+

但不显示预订日期,仅显示 Null 值。

有什么想法吗?

【问题讨论】:

你尝试过什么查询,告诉我们 “时隙”结构和策略在这里出现了很多。如果您还没有这样做,请查看此处的相关侧边栏------> 对不起,第一次使用堆栈溢出,我更新了我的帖子作为答案,而不是编辑。 可能值得使用 datetime 作为开始和结束时间,这样您的代码对于那些预约在午夜之前开始并在午夜之后结束的公司或有持续几天的预约的公司来说是可移植的。 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。 【参考方案1】:

我不是为您提供技术解决方案,而是考虑将问题拆分为子查询。 将子查询结果保存到“标志”变量中,然后像在事务中那样检查它们。 还可以考虑设置一个预订确认阶段(管理页面)以避免预订冲突。

希望对你有帮助

【讨论】:

以上是关于PHP 预约预约可用时间段的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中构建预约系统

如何根据可用时隙和预订时隙查找空闲时隙?

基于php036高校教室预约查询系统

PHP医院网络预约管理系统源码(可商用也可作毕业设计)

[SHOI 2009] 会场预约

微信小程序如何实现时间段预约?