Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中查找可用的约会时段_Mysql - Fatal编程技术网

在MySQL中查找可用的约会时段

在MySQL中查找可用的约会时段,mysql,Mysql,我需要找到符合以下要求的预约系统的可用时段: 可能存在重叠预约,但不得超过指定的容量 应将时隙解析为指定的时间段,例如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架构设置: CR

我需要找到符合以下要求的预约系统的可用时段:

  • 可能存在重叠预约,但不得超过指定的
    容量
  • 应将时隙解析为指定的时间段,例如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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |
查询1

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |
查询2

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |
查询3

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |
查询4

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |
查询5

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

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");
SELECT * FROM calendar
| id |
|----|
|  1 |
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 |
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 |
-- 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"
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 |

这是一个很好的问题,但不知怎么的,我觉得你应该在解决这个问题上多付出一点努力。无论如何,这里有一个简单的提示:如果事件a在事件B结束之前开始,在事件B开始之后结束,那么事件a与事件B重叠。你是对的。我提出了几种方法,但都是用php。它总是以一堆嵌套的foreach循环结束,这让我想到,如果这个问题可以用SQL单独解决的话。我发现最困难的是考虑到同时预约的最大数量。所以现在我想知道,这个问题的一部分是否应该用SQL查询解决,另一部分应该用php解决?你能告诉我在哪里解决哪一个问题吗?这是一个很好的问题,但不知何故,我觉得你应该在解决这个问题上多付出一点努力。无论如何,这里有一个简单的提示:如果事件a在事件B结束之前开始,在事件B开始之后结束,那么事件a与事件B重叠。你是对的。我提出了几种方法,但都是用php。它总是以一堆嵌套的foreach循环结束,这让我想到,如果这个问题可以用SQL单独解决的话。我发现最困难的是考虑到同时预约的最大数量。所以现在我想知道,这个问题的一部分是否应该用SQL查询解决,另一部分应该用php解决?你能告诉我在哪里解决哪个问题吗?