2016-09-14 1 views
0

Ich muss eine Zeittaktungsanwendung für Mitarbeiter machen. Jeder Mitarbeiter wird durch ein Ticket identifiziert, das beim Eintreffen und Verlassen des Gebäudes gescannt wird. Leider kann ich nicht sicher sein, ob sie wegen eines Gesetzes ankommen oder gehen (sie arbeiten im Untergrund).Zeithalte-Tabelle für Mitarbeiter-Taktung

Ich denke über die Gruppierung von zwei Reihen in eine, um die Arbeitsstunden zu erhalten. Das einzige Problem, das ich mit diesem Ansatz habe, taucht auf, wenn das Ticket zwei Mal bei der Ankunft oder beim Verlassen gescannt wird.

Wie würden Sie dieses Problem lösen?

Bisher ist dies die Struktur der TicketUsages Tabelle enter image description here

+0

Wie/wann bekommen sie dieses Ticket? Pro Arbeitstag? Können sie an einem anderen Tag abreisen, als sie eintreten (Nachtarbeit)? Soll 'created_at' die Ankunftszeit und' update_at' die Urlaubszeit sein? – Marco

+1

Um den Doppel-Scan zu verarbeiten, können Sie eine "Toleranzfrist" einführen, bei der ein Scan ignoriert wird, wenn er innerhalb eines kurzen Zeitraums seit dem letzten Scan liegt. Sie können dies auf der Anwendungsseite implementieren oder (Gruppen-) Datensätze in einem Intervall (z. B. 1 Minute) bei der Abfrage aufrollen. Abgesehen davon scheint die Frage für diese Website off-topic zu sein. – mustaccio

+0

Sie haben ein Ticket pro Arbeitstag bekommen. Ja, sie können. 'created_at' und' updated_at' werden auf denselben Wert gesetzt (sie werden vom Framework festgelegt). Wie kann ich zwei aufeinanderfolgende Zeilen paaren, um die Arbeitszeiten zu erhalten? – Vlad

Antwort

0

Wenn ich eine solche Aufgabe zu implementieren wäre, würde ich eine Clean-up-Technik verwenden.

Ich würde durch die letzten Daten gehen (sagen wir gestern) und entfernen (oder markieren Sie useless) alle verdächtigen Zeilen. Später kann ich eine einfache JOIN verwenden „Ankunft“ und „Verlassen“ Zeilen als ein zu lesen:

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 **/ 

Das Bereinigungsverfahren nur Tickets dann mit einer anderen Zählung finden hat 2. Dies wird Ihnen zeigen, die ungültige Tickets:

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 

Dann müssen Sie nur entscheiden, was mit den Zeilen zu tun ist. Wenn es mehr als 2 gibt, können Sie wahrscheinlich nur die erste und die letzte behalten. Aber es liegt an Ihnen, was zu tun ist, wenn nur eine Zeile zurückgegeben wird.

+0

Danke für die Antwort! Leider habe ich eine letzte Stunde Anforderung, sie können das Gebäude mehrmals mit demselben Ticket betreten und verlassen. – Vlad

Verwandte Themen