3

2013-01-01 08:00 と 2013-01-02 08:00 (24 時間) などの特定の期間、時間の経過とともに誰かが連続してレコードを入力して、レコードが使用可能かどうかを示した可能性があります。新しく入力されたレコードの期間が重複する場合は、異なるタイプ (使用可能または使用不可) のみが許可されます。変更が発生した場合、可用性レコードは保持されます。

特定の期間が完全に利用可能かどうかを判断するにはどうすればよいですか?

たとえば、次のレコードがあるとします。

RecId | Start DateTime   | End DateTime     | Type
=====================================================
1     | 2013-01-01 08:00 | 2013-01-02 08:00 | Available
2     | 2013-01-01 08:00 | 2013-01-02 08:00 | Unavailable
3     | 2013-01-01 17:00 | 2013-01-02 08:00 | Available
4     | 2013-01-01 08:00 | 2013-01-02 17:00 | Available
5     | 2013-01-01 12:00 | 2013-01-02 14:00 | Unavailable

上記の記録を考えると、個人は現在、2013 年 1 月 1 日の 08:00 から 12:00 まで、および 14:00 から翌朝 08:00 まで利用可能です。

たとえば、2013-01-01 11:00 から 2013-01-01 15:00 まで、個人が利用可能かどうかを確認したいと思います。記録によると、その日の 12:00 から 14:00 まで、その人物は不在です。

それが役立つ場合、アプリケーションは、誰かがスケジュールされたシフトのすべてまたは一部を別の従業員と交換する資格があるかどうかを確認することです。シフトのさまざまな部分の複数の取引が他の個人と行われる場合があります。一部が重複しない限り、誰かが自分のシフト全体を交換して、そのシフトの一部を他の人に任せることができます。新しい取引がスケジュールされたときに、従業員が要求された時間ブロックで実際に自由に取引できることを確認できる必要があります。

4

4 に答える 4

2

Time Period Library for .NETを使用して、重複する期間と交差する期間を計算できます。

于 2013-04-23T15:08:36.853 に答える
1

あなたの質問を理解できれば、完全に利用可能 =連続して利用可能、つまり利用できないレコード スロットが介在しないということです。つまり、ある日の午前 9 時から午後 5 時まで対応可能であるが、同じ日の午後 2 時から午後 4 時までは対応できないという記録がある人は、その日の午前 9 時から午後 5 時までは対応できません。

したがって、特定の目的のスパンで誰かが利用できるかどうかを調べるには、その目的のスパン内で利用できないスパンが開始または終了しないことを確認し、利用可能なスパンがその目的のスパンが始まる前またはそれと一致する前に開始するかどうかを確認します。そして、目的のスパンの終わりで、または目的のスパンの終わりの後に終了します。

PSまた、目的のスパンが使用不可のスパンに含まれていないことを確認する必要があります。

PPS 複雑さ (または単純さの欠如) は、重複する可能性のある可用性と非可用性の開始スパンと終了スパンを使用することによって作成されます。別の方法として、1 日の時間枠 (おそらく最小は 15 分) を表すエンティティを作成し、1 人あたりの各時間枠について、その人がその時間枠に対応できるかどうかを知ることができます。次に、データベースにクエリを実行し、スロットの特定の範囲内の各スロットのステータスが AVAILABLE であることを要求できます。

于 2013-04-19T19:30:15.267 に答える
0

レコードのエントリを、次のような構造を持つオブジェクトのリストに抽象化します。 class AvailableSlot { public DateTime start; public DateTime end; }

これで、LINQ を使用して問題に対処できます。

        var availableSlots = new List<AvailableSlot>();
        //Read the record file and populate availableSlots
        DateTime inputStart = DateTime.Now; 
        DateTime inputEnd = DateTime.Now.AddHours(2);
        var isAvailable = availableSlots.Any(a => a.start <= inputStart && a.end >= inputEnd);
于 2013-04-19T19:31:10.917 に答える