アプリケーションの詳細についてあまり知らなくても、データを構造化する最良の方法は、テーブルの各レコードを各従業員の単一の「パンチイン/パンチアウト」に対応させることだと思います。そこから、特定の期間に各従業員が働いた時間を計算するのは非常に簡単です。私は間違っていません.2番目の例(Status
列を除いて)でレイアウトされるデータを説明した方法とほとんど同じように聞こえます。
最も単純な例では、テーブルに次の列があります。
UID (INT or uniqueidentifier)
ClockIn (datetime)
ClockOut (datetime)
従業員が出勤したら、その従業員のテーブルに行を挿入し、そのClockIn
列の下に時計を入れます。
UID ClockIn ClockOut
-------------------------------------------
1 2012-10-30 12:00:00.000 NULL
各従業員が出勤すると、それぞれに列が与えられます
UID ClockIn ClockOut
-------------------------------------------
1 2012-10-30 12:00:00.000 NULL
2 2012-10-30 1:00:00.000 NULL
3 2012-10-30 2:00:00.000 NULL
従業員が退勤すると、アプリケーションはその従業員の既存のレコードを取得し、列を退勤時間にUPDATE
設定して行を取得する必要があります。ClockOut
UID ClockIn ClockOut
-------------------------------------------
1 2012-10-30 12:00:00.000 NULL
2 2012-10-30 1:00:00.000 2012-10-30 3:30:00.000
3 2012-10-30 2:00:00.000 NULL
従業員が退勤して後で戻ってきた場合、その日の早い時間に出勤したかのように、新しいレコードが与えられます。
UID ClockIn ClockOut
-------------------------------------------
1 2012-10-30 12:00:00.000 NULL
2 2012-10-30 1:00:00.000 2012-10-30 3:30:00.000
3 2012-10-30 2:00:00.000 NULL
2 2012-10-30 4:30:00.000 NULL
願わくば、この時点で、このかなり単純なデータ モデルが、標準的な時間管理機能のほとんどを可能にするのに十分なほど柔軟であることがわかるはずです。
ClockOut
NULLである行を探すことで、誰が出勤しているかを判断できます。
- 従業員がパンチを忘れた場合に処理するための何らかのプロセスを用意できます
- 出勤または遅刻する従業員のパンチを編集します。
- 行ごとに と を実行し、結果を合計することで、
DATEDIFF
各ClockOut
従業員の合計労働時間を特定できます。ClockIn
この例では、データを検証する責任のほとんどは、後でアプリケーションで行われます。誰かに何度も出勤してもらったり、まだ出勤していないのに退勤させたりしたくないでしょう。