【问题标题】:Mysql Find free time periods between appointments and within working periodsMysql查找约会之间和工作期间内的空闲时间段
【发布时间】: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


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多