![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Zeos
zeitintervall abfrage
Moin,
bei meinem Wiedereinstieg in die Programmierung häng ich erwartungsgemäß an einem Problem fest. und zwar hab ich mir aus meiner datenbank per query eine Datenmenge gezogen, welche ich nun systematisch durchgehen will, um halt meinen Mist damit zu machen. Und zwar liefert mir die DB ein Feld mit, welches ein TimeStamp ist. ich möchte herausfinden, wieviele Datensätze Pro stunde an dem Tag in die DB geschrieben wurden und das Stundenweise in der vollen Stunde, bishin zur letzten Stunde, also Datnsatz dieses Tages. Erschwerend kommt hinzu, das ich Pausen in der Tabelle in der jeweiligen Stunde finden muss, welche größer als 10 Minuten sind. Und das muss dan entsprechend ausgewertet werden als produktivzeit und Unproduktiv. also angenommen, ich habe folgende ergebnisse: 16.12.2015 7:33 16.12.2015 7:33 16.12.2015 7:34 16.12.2015 7:36 16.12.2015 7:48 16.12.2015 7:48 16.12.2015 7:48 16.12.2015 7:49 16.12.2015 7:50 16.12.2015 7:53 als Ergebniss müsste dann kommen: Begin Arbeitszeit 7:33 Arbeitszeit Stunde 7: 27 Minuten Produktivzeit Stunde 7: 15 Minuten Unproduktivzeit Stunde 7: 12 Minuten Und das halt für jede Stunde des Tages, welcher in den Ergebnissen ist. geordnet sind die datensätze über den Zeitstempel. Mein Gedankengang war folgender: per findfirst auf den ersten Ds, per HourOf die stunde rausfinden. Aber wie geh ich weiter vor? Ist das überhaupt sinnvoll? |
AW: zeitintervall abfrage
Moin...:P
Zitat:
Merkst du? Ich habe es nicht wirklich verstanden wie du das meinst bzw. was das Ergenbis sein soll...8-) |
AW: zeitintervall abfrage
Zitat:
Wenn die erste in der DB protokollierte Aktion um 7:33 Uhr statt fand, heißt das noch längst nicht, das die Arbeitszeit zu diesem Zeitpunkt begann. Ebenso scheint mir die Aufteilung in Produktiv und Unproduktiv sagen wir mal willkürlich zu sein. Ein böser Mensch würde da jetzt im Hintergrund eine Batchdatei installieren, die alle 53 Sekunden ein und den selben Datensatz mit einer Änderung abspeichert. Das ist Fleiß, der eine enorme Unproduktivität nach sich zieht. Gruß K-H |
AW: zeitintervall abfrage
Ich würde wenn möglich die Datenbankstruktur ändern bzw. eine automatische Überführung der Daten durchführen (einmalig + fortlaufend Trigger) welche die Daten dann in eine (brauchbare und) auswertbare Form bringt.
|
AW: zeitintervall abfrage
ok, etwas unglücklich formuliert mit der Arbeitszeit.
an der DB kann ich nix ändern, ich bekomm die so als auszug. Das ist keine Auswertung, welche einen Mitarbeiter überwacht. es geht im speziellen darum, das "unproduktive zeiten" ortswechsel sind. die datensätze werden von einem messegrät geliefert und die häufigkeit ist relativ. mit arbeitszeitbeginn meinte ich begin der messungen. arbeitszeit begin ist immer gleich für die MA. theoretisch kann ich mir ne dummy db anlegen, und darin die daten aufschlüsseln. aber ich bin einfach auch schon ne weile raus und häng halt da an einer blockade. Wie könnte ich das sinnvoll lösen, ohne die struktur der db anfassen zu müssen? was ist gemeint mit: "wie ist der timestamp zu interpretieren?"? Ich habe (noch?) keinen algorythmus... ich wüsste auch nicht gleich auf anhieb, wie ich sowas realisieren kann. |
AW: zeitintervall abfrage
An einem (einzigen) Timestamp kannst Du ja nicht sehen, was er bedeutet (Anfang Produktivphase oder Ende Produktivphase=Beginn Pause). Dies ergibt sich nur im Kontext aller Datensätze eines Tages ( Anmeldung/Abmeldung alternierend).
Deshalb birgt eine Betrachtung der Werte einer Stunde ein hohes Risiko komplett falsch zu sein ( Produktivphasen und Pausen vertauscht). |
AW: zeitintervall abfrage
hm, ich verstehe.
Aber irgendwie sollte dies doch zu schaffen sein. gedanklich kann ich ja die pausen auch per blick auf die daten finden. also sollte dies auch per programm möglich sein. mir ist die ganze zeit, als würde ich irgendwas übersehen bzw. nicht so richtig bedenken. mir liegt die auswertung sozusagen auf der zunge. irgendwie kotzt mich das grad an... |
AW: zeitintervall abfrage
Zitat:
Begin Arbeitszeit 7:33 Arbeitszeit Stunde 7: 27 Minuten Produktivzeit Stunde 7: 15 Minuten Unproduktivzeit Stunde 7: 12 Minuten |
AW: zeitintervall abfrage
Zitat:
Begin Arbeitszeit = 7:33 Uhr Arbeitszeit in Stunde 7 entspricht 27 Minuten Produktivzeit in Stunde 7 entspricht 15 Minuten Unproduktivzeit in Stunde 7 entspricht 12 Minuten |
AW: zeitintervall abfrage
Zitat:
Was mir noch fehlt ist der "Datenrahmen". Also was kommt vor 7.33 und nach 7:53? Und welche Intervalle werden generell abgefragt? Immer nur ein bestimmter Tag? |
AW: zeitintervall abfrage
ja, die abfrage erfolgt per datum, also nur meinetwegen der 16.12.2015
der order by befehl auf den timestamp gibt ja ne ordentliche chronologische sortierung zurück. damit ist der erste datensatz auch der zeitigste. also ist dies als beginn zu sehen. wenn der nächste datensatz unter 10 min unterschied ist, is alles ok und es geht mit dem nächsten ds weiter. immer im vergleich zum vorigen. eine pause entsteht also erst, wenn zwischen 2 Datensätzen eine zeitspanne von über 10 minuten entsteht. Nachtrag: natürlich kommen nach 7.53 uhr noch weiter stunden mit x Datensätzen. Aber es muss ja stundenweise zur vollen stunde die auswertung erfolgen. |
Konzeptvorschlag
|
AW: Konzeptvorschlag
Zitat:
Hier allerdings aber auch nicht klar, was der TO da haben will. Wenn also Timestamps bei 7:53 und 8:09 liegen. Wird das gewertet? Zu welcher Stunde? |
AW: zeitintervall abfrage
da ist das Konzept schon mal etwas löchrig. Es sei den es geht nur darum zu schauen ob vormittags oder abends die Speicherung behindert wird.
Aber ein Intervall von 10min in Bezug auf eine Stunde?? Ich würde es ungefähr so machen:
Delphi-Quellcode:
Gruß
if timestamp[i]+600sec>timestamp[i+1] then writeln('Unterbrechung von '+timestamp[i]+' bis '+timestamp[i+1];
K-H |
AW: zeitintervall abfrage
Wenn man nur den Zeitraum betrachtet, der innherhalb dieser einen Stunde liegt, kann man gar nicht beurteilen, ob hier mit der Arbeit erst um 07:33 begonnen hat, oder ob der schon seit 06:45 da ist, und nun aber erst mal eine Mütze voll Schlaf nimmt.
Das Ergebnis wäre für diese Stunde dann völlig anders:
Um 07:53 oder erst gegen 16:00?
|
AW: Konzeptvorschlag
Zitat:
Zitat:
|
AW: zeitintervall abfrage
Ja, ich glaube, dass er bei der Anforderungsdefinition noch nachlegen muss, ist klar. Fehlt nur noch eine Antwort vom TO.
|
AW: zeitintervall abfrage
Hallo,
das mit dem Stundenweisem Auslesen ist eine Vorgabe, die ich habe. Den Hinweis bzgl. der evtl. vorhandenen Pausen am "Stundenübergang" habe ich bereits mit dem "Auftraggeber" ausgewertet. Er will das halt so, auch wo ich ihm das genauer rklärt habe, das es Schwachsinn ist. man müsste rigoros die Intervalle prüfen, ob Pause oder nicht. Ansonsten ist es löchrig wie ein Sieb. Steh da aber noch in Verhandlung. Es geht ja nicht darum, die Arbeitszeit an sich zu betrachten. Es gibt verschiedene Aufgaben, welche sonst noch anfallen. Der Begin und das Ende der Arbeitszeit erfolgt per Stechkarte, ist also relativ egal für das geschilderte Problem. Wie gesagt, es hat nicht den Sinn, zu Überwachen, was der Arbeitnehmer macht. Es hat insofern mehr damit zu tun, die Messergebnisse auf eine gewisse Konsistenz zu prüfen. Weiterführend wäre da zu erwähnen, das es unwahrscheinlich ist, das in einer Minute mehr als 2 Messungen erfolgen. Wenn die häufiger wären, wäre es ein Fehlverhalten, sei es vom Gerät oder Arbeitnehmer. Vielmehr sollen die Daten halt auf eine gewisse logische Art geprüft werden, ob die Abstände als sinnvoll zu erachten sind. Im Nachhinein werden noch andere Sachen aus den Daten ausgewertet. Aber das halt nur, wenn solche Pausen oder "Schnellmessungen" erfolgen. Sonst wäre der aufwand exorbitant hoch... Fakt ist, der erste Datensatz stellt den Begin dieser Tätigkeit, unabhängig der Arbeitszeit des AN dar. Es ist nicht so, das die Arbeit dort durch anderweitige Tätigkeiten unterbrochen wird. Persöhnliche Bedürfnisse sowie Pausenzeiten natürlich ausgenommen. Mfg Matthias |
AW: zeitintervall abfrage
Ja und wie werden die Pausen nun auf die Stunden gelegt, wenn sie die volle Stunde schneiden?
|
AW: zeitintervall abfrage
ich hab morgen ne telefonkonferenz. da werd ich das nochmal ganz gezielt ansprechen.
ich bin ja immernoch der meinung, das eine pausenauswertung auf die volle stunde gerechnet mist ist. Wenn die es denn aber so haben wollen, solls mir egal sein. da fällt halt sowas raus. Im endeffekt können wir alle nur das tun, was von uns verlangt wird... Auch, wenn man ewig für diskutiert... |
AW: zeitintervall abfrage
Das eine schließt doch das andere nicht aus. Dein AG will offenbar zu jeder Stunde einen Bericht über die Produktivität seiner Untergebenen, wie man das z.B. von gewissen Callcentern kennt, wo gleich der oder die Vorgesetzte anrauscht, wenn man nach dem Auflegen nicht sofort die nächste Nummer wählt. Das kannst du ihm doch liefern, auch wenn sich die Pause über die aktuelle Stunde hinauszieht. In diesem fall vermerkst du eben nur den Anteil der Pause, der sich noch innerhalb der Stunde befindet, um im nächsten Bericht den Rest der Pause mit einzubeziehen.
|
AW: zeitintervall abfrage
Das Problem ist -wie so oft- das die Datenstruktur eine Auswertung erschwert, wenn nicht sogar unmöglich macht. Am einfachsten wäre es, eine Tabelle aller Minutenzeiten des Tages zu nehmen und mit einer Intervaltabelle zu verknüpfen. Mal sehen
Hmm.
Code:
Liefert mir eine Tabelle mit Anfangs und Endzeit der Intervalle sowie der Information, ob das Interval Produktivzeit ist, oder nicht. Das mit dem 'case' geht in FB bestimmt anders.
select t1.Zeit as StartZeit
, t2.Zeit as EndZeit , case when t2.Zeit - t1.Zeit > 10 minuten then 0 else 1 end as Produktiv from Tabelle t1 join Tabelle t2 on t1.ID = t2.ID-1 Diese Tabelle nenne ich jetzt mal 'Intervalle'. Jetzt habe ich eine Tabelle mit einer Spalte, in der einfach alle Datum+Uhrzeiten je Minute drinstehen. Pro Tag sind das 1440 Einträge. Pro Jahr ca. 400.000. Diese Tabelle erstellen wir uns einmal und parken sie in der DB. Wir nennen sie MinutenZeiten. Nun liste ich mir für jede Minute des Tages auf, ob die Minute produktiv war oder nicht.
Code:
Cool. Fehlt noch das Aggregat
select m.Uhrzeit,
i.Produktiv from Minuten m join Intervalle i on m.Uhrzeit between i.StartZeit and i.EndZeit
Code:
Fast fertig. Denn die Auswertung berücksichtigt nicht Arbeitsbeginn und -Ende. Diese Zeiten werden als 'Unproduktiv' markiert. Aus der Intervalltabelle müsste man sich jetzt noch die kleineste StartZeit und die größte Endzeit des jeweiligen Tages nehmen und das im Aggregat berücksichtigen.
select DatePart(Stunde, m.Uhrzeit) as Stunde
, sum (Produktiv) as Produktiv , sum (1-Produktiv) as Unproduktiv from Minuten m join Intervalle i on m.Uhrzeit between i.StartZeit and i.EndZeit Group by DatePart(Stunde, m.Uhrzeit) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz