PostgreSQL:自由时隙算法

时间:2013-08-21 14:58:37

标签: postgresql calendar gaps-and-islands

我有一张表中有一些时间段,例如:

#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操作符,但无法弄清楚如何操作。

1 个答案:

答案 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))