2016-09-14 11 views
0

私は従業員のためのタイムクロッキングアプリケーションを作成する必要があります。すべての従業員は、到着時にスキャンされて建物から出る航空券で識別されます。残念ながら、彼らが法律のために到着または離れるかどうかはわかりません(彼らは地下で働いています)。従業員の計時のための保守テーブル

私は何とか2行を1つにまとめて作業時間を得ることを考えています。この方法を使用している唯一の問題は、チケットが到着時または出発時に2回スキャンされた場合に表示されます。

どのようにこの問題を解決しますか?

は今までこれはTicketUsagesテーブルの構造である enter image description here

+0

どのようにしてこのチケットを取得しますか? 1営業日に?彼らは別の日に出発してから入社することができますか? 'created_at'は到着時間であり、' updated_at'は離脱時間であるはずですか? – Marco

+1

二重スキャンを処理するには、前回のスキャンから短時間の間にスキャンが無視される「猶予期間」が導入される可能性があります。これをアプリケーション側で実装することも、クエリを実行するときに一定の間隔(1分など)でレコードをロールアップ(グループ化)することもできます。そのことを言っても、このサイトの質問は話題にはならないようです。 – mustaccio

+0

1日に1枚のチケットがあります。はい、そうすることができます。 'created_at'と' updated_at'は同じ値に設定されています(フレームワークによって設定されています)。どのように2つの連続した行をペアにして勤務時間を得ることができますか? – Vlad

答えて

0

私は、このようなタスクを実装した場合、私はクリーンアップのテクニックを使用します。

すべての疑わしい行を削除して(またはuselessとマークして)、最近のデータを確認しています(昨日のことを考えてみましょう)。その後、私は1つとして「到着」と行を「残して」読むために簡単なJOINを使用することができます。

SELECT * 
FROM TicketUsages arriving 
JOIN TicketUsages leaving 
    ON arriving.ticket_id = leaving.ticket_id 
    AND arriving.created_at < leaving.created_at 
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14' 
    /** Optional: AND NOT arriving.useless AND NOT leaving.useless **/ 

クリーンアップ手順が異なるだけで、カウントしてチケットを見つけることがあり、その後2.これはあなたの無効を表示しますチケット:

SELECT ticket_id, count(*) 
FROM TicketUsages 
WHERE from_unixtime(arriving.created_at, '%Y-%m-%d') = '2016-09-14' 
GROUP BY ticket_id 
HAVING count(*) != 2 

次に、行の処理方法を決定するだけです。 2つ以上ある場合は、おそらく最初と最後を保持するだけです。しかし、1行しか返されなければ何をするかはあなた次第です。

+0

ありがとうございました!残念ながら私は最後の1時間の要件を持っている、彼らは同じチケットで建物を複数回出入りすることができます。 – Vlad

関連する問題