2013-08-21 47 views
0

我有一個表,在它的一些時隙中,例如:的PostgreSQL:免費時隙算法

#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 
+=======================================================+ 

在上面的例子中,用戶ID機智3具有在8:10的槽。 (如果userid = -1,則表示它是一個空閒插槽)。他與代理5預約。例如,現在用戶3想要另一個時隙,但是這次是代理7。所以,該算法應該只保留7號的空閒時隙,並且可能的時隙不會重疊。這意味着,在這種情況下,只有第9條記錄纔是解決方案。 (但也許在另一種情況下,有多種解決方案)。另一件事,用戶只能與同一個代理進行一次約會。

任何想法如何實現?我正在考慮與OVERLAPS運營商,但無法弄清楚如何做到這一點。

+0

考慮使這個更簡單,更易於閱讀。從經驗來看,人們很少回答/幫助看起來過於複雜和冗長的問題。 – eatonphil

+1

反過來想一想。你想要所有可能的時隙,除了那些重疊的。 –

+0

@RichardHuxton的確,但我不知道該怎麼做。這是這個話題的重點。我如何獲得所有重疊的時刻? –

回答

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