我有一张表中有一些时间段,例如:
#id datet userid agentid duration
+=======================================================+
|1 |2013-08-20 08:00:00 |-1 |3 |5
|2 |2013-08-20 08:05:00 |-1 |3 |5
|3 |2013-08-20 08:10:00 | 3 |3 |5
|4 |2013-08-20 08:15:00 |-1 |3 |5
|5 |2013-08-20 08:20:00 |-1 |3 |5
|6 |2013-08-20 08:25:00 |-1 |3 |5
|7 |2013-08-20 08:30:00 |-1 |3 |5
|8 |2013-08-20 08:05:00 |-1 |7 |15
|9 |2013-08-20 08:20:00 |-1 |7 |15
+=======================================================+
在上面的例子中,用户机智3在8:10有一个插槽。 (如果userid = -1,则表示它是一个空闲插槽)。他预约了代理5.例如,现在用户3想要另一个时隙,但这次是代理7.因此,算法应该只保留agentid 7的空闲时隙和不重叠的可能时隙。这意味着,在这种情况下,只有第9条记录才是解决方案。 (但也许在另一种情况下,有多种解决方案)。另一件事,用户只能与同一个代理进行一次约会。
任何想法如何实现?我正在考虑使用OVERLAPS操作符,但无法弄清楚如何操作。
答案 0 :(得分:1)
尝试类似:
select *
from time_slots ts
where agentid = 7 -- or any agent
and userid = -1 -- it is free
and not exists (select 1 -- and overlaping interval does not exist
from time_slots ts_2
where ts_2.userid <> -1 -- not free
and (ts.datet, ts.datet + interval '1 hour' * ts.duration) OVERLAPS
(ts_2.datet, ts_2.datet + interval '1 hour' * ts_2.duration))