2011-10-28 13 views
1

と重ねた時間範囲を取得しますが、私は何をすべきか、または解決する方法がわからない問題に遭遇しました私ができる限り最高。 は、次のような表があるとします。私が見つけたいもの私はタスクスケジューラをしようとしてmを条件

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日間考え、まだいないされています...誰かが私を助けることができる?

+0

どのような粒度が必要ですか? 30分? 1時間?一分? – Jack

+0

半時間は問題ありませんが、それは何かに影響しますか? – Kossel

+0

ええ、簡単にすべてを離散化することができるので、多くのステップを実行する必要はありません。 – Jack

答えて

0

粒度が十分に粗いので、30分のステップを踏んで、すべての従業員が実際に忙しいかどうかを確認できます。

ブール値の配列を保つことができます。ブール値は、従業員が現在忙しいかどうかを伝えるすべての従業員に対して1つです。

その後、あなたは30分(のは午前6時からと仮定してみましょう)の段階で行く:あなたはすべての場合は、対応するフラグ

  • trueに設定し、すべての開始活動のために、6AMで彼らの活動を開始し、誰チェック

    1. フラグが重複範囲が起こった場合は、それ以外の場合は、開始重複範囲を持って、その後、ここでtrueに設定され、従業員のすべての開始活動のために30分
    2. ことによってそれ
    3. 増加時間を停止trueに彼のフラグを設定
    4. 従業員のすべての終了活動のため
    5. は(私は私の会社の自家製DBを使用するので、私たちを使用し、これは擬似-SQLでそれを解決するかどうかを参照してください2
  • +0

    しかし、あまりにも多くのプロセスが30分ごとにチェックしていませんか?私は一日の時間範囲だけを取得したくないので、可能な場合は少なくとも3ヶ月または1年の時間範囲が必要です。 – Kossel

    +0

    あなたはすべての活動を確実に探検しなければなりません。データを直接操作することで、簡単に行えます:30分のステップを経ることなく、実際に正しい順序で抽出するように並べ替えます(誰かがアクティビティを開始または停止するたびに抽出しますが)速い方法があるとは思わない。あなたは本当に複雑な操作を行う必要があります。 – Jack

    0

    ステップに戻る

  • falseに彼のフラグを設定します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 
    
  • 関連する問題