0

いくつかのタイムスロットを含むテーブルがあります。例:

#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 との予定です。したがって、アルゴリズムはエージェント ID 7 の空きスロットと重複しない可能性のあるスロットのみを保持する必要があります。これは、この場合、9 番目のレコードのみが解決策になることを意味します。(しかし、別のケースでは、複数の解決策があるかもしれません)。もう 1 つは、ユーザーが同じエージェントとのアポイントメントを 1 つしか持てないことです。

これを実装する方法はありますか?OVERLAPS オペレーターで考えていましたが、その方法がわかりません。

4

1 に答える 1

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))
于 2013-08-21T15:13:36.240 に答える