2016-03-22 9 views
0

私は、ユーザーのチェックインとチェックアウトのタイミングがレコーダーの従業員ログインシステムを開発しています。私は、特定の月の従業員の総勤務時間を照会したいと思う次のmySqlテーブルスキーマを持っています。日付差の合計を計算する

AttendanceId UserId Operation CreatedDate 
24     4  1  2016-03-20 23:18:59 
25     4  2  2016-03-20 23:19:50 
26     4  1  2016-03-20 23:20:28 
27     4  2  2016-03-20 23:20:31 

操作1はチェックイン用であり、操作2はチェックアウト用です。誰でもこのクエリを作成するのに役立つことができますか?

+2

従業員が31日にチェックインして1日目にチェックアウトするとどうなりますか? – Strawberry

+0

@Strawberry私はそれを忘れてしまった。同じアイデアかより良いスキーマを提案できますか? –

+0

ちょうど質問に答えてください。またはしないでください。それはあなた次第です。 – Strawberry

答えて

0

喜んで複雑な質問、ありがとう。私のクエリで扱うもの:

  • 時間単位で正確に測定されない出席者。計算の終了時に秒数が合計され、3600で除算されます。
  • エンド(感謝strawberry
  • 開始している現在の月の出席(オペレーション「1」とのエントリがある)が、「該当する操作はありません(まだ終わっていないのいずれかで月の境界をまたぐ出席2 ")。

私はテストのために、以下のデータを使用:

INSERT INTO Attendance(UserId, Operation, CreatedDate) VALUES 
(4, 1, '2016-01-01 15:00:00'), 
(4, 2, '2016-01-01 19:00:00'), 
(4, 1, '2016-01-31 23:00:00'), 
(4, 2, '2016-02-01 01:00:00'), 
(4, 1, '2016-02-20 23:18:59'), 
(4, 2, '2016-02-20 23:19:50'), 
(4, 1, '2016-02-20 23:20:28'), 
(4, 2, '2016-02-20 23:20:31'), 
(4, 1, '2016-02-29 23:00:00'), 
(4, 2, '2016-03-01 01:00:00'), 
(4, 1, '2016-03-02 15:00:00'), 
(4, 2, '2016-03-02 18:00:00'), 
(4, 1, '2016-03-22 10:00:00'); 

クエリは、特定の月のすべてのユーザーの時間を選択します。 1つのクエリで1ヶ月以上の結果を選択すると、出席が月境界にまたがる可能性があるため、さらに複雑になります。必要に応じて、SQLで4つの日付を適切に調整して繰り返し実行します。

最も内側のクエリは、すべてのユーザーのすべての到着時刻と対応する出発時刻を選択します。外側のクエリは、現在の月にそれらを制限し、2回の間の差を計算し、それらをユーザーによって合計します。