mysql - 在 MySQL 中查找可用的预约空档
问题描述
我需要为具有以下要求的预约系统找到可用的时间段:
- 可能有重叠的约会,但不能超过指定的
capacity
- 时隙应解析为指定的时间段,例如 15 分钟
- 可用性取决于星期几,例如星期一 08:00:00 - 12:00:00 和 13:00:00 - 18:00:00
- 我需要获取指定日期/时间段内的时间段,例如从 2020-01-01 08:00:00 到 2020-02-01 18:00:00
我只是无法理解它。任何帮助是极大的赞赏!
我的表格如下所示。最后一个表是我希望从我正在寻找的查询中收到的输出。
MySQL 5.6 架构设置:
CREATE TABLE calendar (
id INT
);
INSERT INTO calendar(id) VALUES(1);
CREATE TABLE appointments (
id INT,
calendarid INT,
startdatetime DATETIME,
duration TIME
);
INSERT INTO appointments(id,calendarid,startdatetime,duration) VALUES
(1,1,"2020-01-01 09:30:00", "01:00:00"),
(2,1,"2020-01-01 10:00:00", "01:00:00"),
(3,1,"2020-01-01 14:00:00", "00:30:00"),
(4,1,"2020-01-02 08:00:00", "02:00:00"),
(5,1,"2020-01-02 13:00:00", "02:00:00");
CREATE TABLE availability(
id INT,
calendarid INT,
weekday INT, -- 1 = monday, 7 = sunday
starttime TIME,
endtime TIME,
capacity INT
);
INSERT INTO availability(id,calendarid,weekday,starttime,endtime,capacity) VALUES
(1,1,1,"08:00:00","12:00:00",2),
(2,1,1,"13:00:00","17:00:00",2),
(3,1,2,"08:00:00","12:00:00",2),
(4,1,2,"13:00:00","17:00:00",2),
(5,1,3,"08:00:00","12:00:00",2),
(6,1,3,"13:00:00","17:00:00",2),
(7,1,4,"08:00:00","12:00:00",1),
(8,1,4,"13:00:00","15:00:00",1),
(9,1,5,"08:00:00","12:00:00",2),
(10,1,5,"13:00:00","15:00:00",2);
CREATE TABLE desired_output (
slot DATETIME
);
-- 2020-01-01 => weekday = 3, capacity = 2, available 08:00:00-12:00:00 and 13:00:00-17:00:00
-- 2020-01-02 => weekday = 4, capacity = 1, available 08:00:00-12:00:00 and 13:00:00-15:00:00
INSERT INTO desired_output(slot) VALUES
("2020-01-01 08:00:00"), -- last possible because at 10:00 there is no capacity left
("2020-01-01 13:00:00"),
("2020-01-01 13:15:00"),
("2020-01-01 13:30:00"),
("2020-01-01 13:45:00"),
("2020-01-01 14:00:00"),
("2020-01-01 14:15:00"),
("2020-01-01 14:30:00"),
("2020-01-01 14:45:00"),
("2020-01-01 15:00:00"),
("2020-01-02 10:00:00");
查询 1:
SELECT * FROM calendar
结果:
| id |
|----|
| 1 |
查询 2:
SELECT * FROM appointments
结果:
| id | calendarid | startdatetime | duration |
|----|------------|----------------------|----------|
| 1 | 1 | 2020-01-01T09:30:00Z | 01:00:00 |
| 2 | 1 | 2020-01-01T10:00:00Z | 01:00:00 |
| 3 | 1 | 2020-01-01T14:00:00Z | 00:30:00 |
| 4 | 1 | 2020-01-02T08:00:00Z | 02:00:00 |
| 5 | 1 | 2020-01-02T13:00:00Z | 02:00:00 |
查询 3:
SELECT * FROM availability
结果:
| id | calendarid | weekday | starttime | endtime | capacity |
|----|------------|---------|-----------|----------|----------|
| 1 | 1 | 1 | 08:00:00 | 12:00:00 | 2 |
| 2 | 1 | 1 | 13:00:00 | 17:00:00 | 2 |
| 3 | 1 | 2 | 08:00:00 | 12:00:00 | 2 |
| 4 | 1 | 2 | 13:00:00 | 17:00:00 | 2 |
| 5 | 1 | 3 | 08:00:00 | 12:00:00 | 2 |
| 6 | 1 | 3 | 13:00:00 | 17:00:00 | 2 |
| 7 | 1 | 4 | 08:00:00 | 12:00:00 | 1 |
| 8 | 1 | 4 | 13:00:00 | 15:00:00 | 1 |
| 9 | 1 | 5 | 08:00:00 | 12:00:00 | 2 |
| 10 | 1 | 5 | 13:00:00 | 15:00:00 | 2 |
问题 4:
-- desired parameters
SET
@search_window_start = "2020-01-01 08:00:00",
@search_window_end = "2020-01-02 18:00:00",
@appointment_duration = "02:00:00",
@slot_size = "00:15:00"
结果:
问题 5:
SELECT * FROM desired_output
结果:
| slot |
|----------------------|
| 2020-01-01T08:00:00Z |
| 2020-01-01T13:00:00Z |
| 2020-01-01T13:15:00Z |
| 2020-01-01T13:30:00Z |
| 2020-01-01T13:45:00Z |
| 2020-01-01T14:00:00Z |
| 2020-01-01T14:15:00Z |
| 2020-01-01T14:30:00Z |
| 2020-01-01T14:45:00Z |
| 2020-01-01T15:00:00Z |
| 2020-01-02T10:00:00Z |
解决方案
推荐阅读
- python - 在许多标签中多次更改图像的最佳方法是什么?
- ruby - ruby - 计算天数的差异
- reactjs - 内部回调函数 - 始终显示初始状态
- azure - 无法在 powershell core 6.2.0 中安装 nuget 包提供程序
- awk - AWK - 了解使用 FILENAME 和 OFS 获得的不同输出
- javascript - 在 React 中滚动到 DOM 元素
- c - 函数头中struct *和struct **的区别
- powerbi - 如何在 PowerBI 中子查询过滤器
- angular - 我应该为表单数据创建一个类吗?
- javascript - 将 2 个节点进程连接到 fakeredis