条件と重複した時間範囲を取得する

私はタスクのスケジューラーを作ろうとしていますが、何をするか、解決する方法がわからない問題に遭遇しました:S

できるだけ説明するつもりです。 次のような表があります。

key | start |  end  | employee(fk) 
 1    6:00    8:00     A               
 2    9:00    11:00    B
 3    7:00    9:00     B
 4    7:00    11:00    C

in image

私が見つけたいのは、N人の従業員のセットが与えられた場合、与えられた従業員によってすべての重複した時間範囲を返すことです。それは与えられた従業員の "AND'ed"行を取得するようなものです。 (言い換えれば、与えられたすべての従業員が働いているすべての時間範囲を取得する)

例:

given {A,B}   returns 2 columns 7:00  |  8:00  time range which overlaped by A and B
given {B,C}  returns  2 columns 9:00  |  11:00  time range which overlaped by B and C

私は3日間考えていて、まだ何をすべきか分かりません...誰かが私を助けることができますか?

1
どんな粒度が必要ですか? 30分? 1時間?一分?
追加された 著者 Jack,
ええ、あなたが簡単にそれらの多くを行う必要がないことを確認してすべてを離散化することができます
追加された 著者 Jack,
30分は問題ありませんが、それは何かに影響しますか?
追加された 著者 Kossel,

2 答え

あなたの細かさは十分に粗いので、30分のステップで行けば、すべての従業員が実際に忙しいかどうかを確認することができます。

すべての従業員に対して1つのブール値の配列を保持することができます。ブール値は、その従業員が現在の時間にビジーであるかどうかを示します。

次に30分のステップを踏みます(午前6時から仮定しましょう):

  1. 6AMで活動を開始する人をチェックします。開始アクティビティごとに対応するフラグに設定されます。
  2. すべてのフラグがtrueに設定されている場合は、ここでは範囲が重複しています。そうでない場合は、範囲が重複している場合は停止します。
  3. 時間を30分増加させる
  4. 従業員の行動を開始するたびに、フラグをtrueに設定します。
  5. 従業員のすべての終了アクティビティに対して、フラグをfalseに設定します。
  6. 手順2に戻る
0
追加された
すべての活動を確実に探検しなければなりません。データを直接操作することで、簡単に行えます:30分のステップを経ることなく、実際に正しい順序で抽出するように並べ替えます(誰かがアクティビティを開始または停止するたびに抽出しますが)速い方法があるとは思わない。あなたは本当に複雑な操作を行う必要があります。
追加された 著者 Jack,
あまりにも多くのプロセスが30分ごとにチェックしていますか?私は1日の時間範囲だけを取得したくないので、可能な場合は少なくとも3ヶ月または1年間で時間範囲が必要です。
追加された 著者 Kossel,

これがpsuedo-SQLで解決できるかどうかを確認してください(私は自社の自家製DBを使用していますので、SQL構文を使用してください)。テーブル名「テーブル」を想定します。

SELECT T1.employee, T2.employee, T1.start, T2.end 
FROM Table T1, Table T2 
WHERE T1.key!=T2.key AND T1.employee!=T2.employee 
      AND T1.start <= T2.end AND T1.start >= T2.start
0
追加された