【发布时间】:2022-06-11 01:50:05
【问题描述】:
表格“工作时间”:
| id | started_at | ended_at |
|---|---|---|
| 1 | 2022-06-09 08:00:00 | 2022-06-09 12:00:00 |
| 2 | 2022-06-09 13:00:00 | 2022-06-09 16:00:00 |
表“约会”:
| id | started_at | ended_at |
|---|---|---|
| 1 | 2022-06-09 08:00:00 | 2022-06-09 09:00:00 |
| 2 | 2022-06-09 09:00:00 | 2022-06-09 10:00:00 |
| 3 | 2022-06-09 15:00:00 | 2022-06-09 16:00:00 |
我需要仅使用一个 MySQL 查询(语句)在“工作时间段”内找到空闲时间段,并排除“约会”。因此,查询结果应如下表:
| id | started_at | ended_at |
|---|---|---|
| 1 | 2022-06-09 10:00:00 | 2022-06-09 12:00:00 |
| 2 | 2022-06-09 13:00:00 | 2022-06-09 15:00:00 |
我尝试了以下查询,它几乎可以满足我的需求,但只与一个使用 2 个硬编码变量定义的“工作期”相关联:
set @timeSlider='2022-06-09 08:00:00';
set @timeMaximum='2022-06-09 15:00:00';
select if (d.name = 'free', @timeSlider, a.started_at) as started_at,
if (d.name = 'free', a.started_at, @timeSlider := a.ended_at) as ended_at,
d.name as `status`
from (select 1 as place, 'free' as name union select 2 as place, 'busy' as name) as d
inner join appointments a
having started_at < ended_at AND `status` = 'free'
union select @timeSlider as started_at, @timeMaximum as ended_at, 'free' as `status`
from (select 1) as d
where @timeSlider < @timeMaximum
order by started_at, ended_at;
有没有办法单独设置每个“工作期”的变量并将整个查询放在 1 个 SQL 语句中?或者也许有其他方法可以解决这个问题?
【问题讨论】:
-
混合两个表(4 个 UNION)中的所有时间点,然后将它们组合到相邻范围。根据上表将工作周期表中的每个范围划分为时间范围。删除属于约会的时间范围。
标签: mysql sql time mariadb gaps-and-islands