Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   zeitintervall abfrage (https://www.delphipraxis.net/187626-zeitintervall-abfrage.html)

MatthiasK 16. Dez 2015 11:45

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?

haentschman 16. Dez 2015 11:49

AW: zeitintervall abfrage
 
Moin...:P
Zitat:

wieviele Datensätze Pro stunde an dem Tag in die DB geschrieben wurden
Wer schreibt die rein? Wie ist der Timestamp zu interpretieren? Durch welchen Algorithmus trennst du produktiv und unproduktiv?
Merkst du? Ich habe es nicht wirklich verstanden wie du das meinst bzw. was das Ergenbis sein soll...8-)

p80286 16. Dez 2015 12:03

AW: zeitintervall abfrage
 
Zitat:

Zitat von MatthiasK (Beitrag 1324607)
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

Alleine hierbei kräuseln sich mit die Zehennägel.
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

mkinzler 16. Dez 2015 12:13

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.

MatthiasK 16. Dez 2015 13:06

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.

mkinzler 16. Dez 2015 13:15

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).

MatthiasK 16. Dez 2015 13:27

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...

Jumpy 16. Dez 2015 14:02

AW: zeitintervall abfrage
 
Zitat:

Zitat von MatthiasK (Beitrag 1324623)
gedanklich kann ich ja die pausen auch per blick auf die daten finden.

Echt? Ich nicht. Ich weiß nicht, wie du aus den gegebenen Daten Pausen usw. ausliest. Wie kommst du auf:

Begin Arbeitszeit 7:33
Arbeitszeit Stunde 7: 27 Minuten
Produktivzeit Stunde 7: 15 Minuten
Unproduktivzeit Stunde 7: 12 Minuten

baumina 16. Dez 2015 14:14

AW: zeitintervall abfrage
 
Zitat:

Zitat von Jumpy (Beitrag 1324626)
Zitat:

Zitat von MatthiasK (Beitrag 1324623)
gedanklich kann ich ja die pausen auch per blick auf die daten finden.

Echt? Ich nicht. Ich weiß nicht, wie du aus den gegebenen Daten Pausen usw. ausliest. Wie kommst du auf:

Begin Arbeitszeit 7:33
Arbeitszeit Stunde 7: 27 Minuten
Produktivzeit Stunde 7: 15 Minuten
Unproduktivzeit Stunde 7: 12 Minuten

Man muss es anders lesen, hab auch ne Weile gebraucht, dann ist es eine Art Gruppenwechsel.

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

jobo 16. Dez 2015 14:21

AW: zeitintervall abfrage
 
Zitat:

Zitat von baumina (Beitrag 1324628)
Man muss es anders lesen, hab auch ne Weile gebraucht, dann ist es eine Art Gruppenwechsel.

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

So hab ich das auch interpretiert. Mit SQL wäre es wohl relativ harmlos über Window Functions. Aber die gibt's erst in fb 3.0.

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?

MatthiasK 16. Dez 2015 14:29

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.

Perlsau 16. Dez 2015 15:08

Konzeptvorschlag
 
  1. Erst mal den betreffenden Tag selektieren: Select * from Datensaetze where Datum = '16.12.2015';
  2. Dann für jede Stunde einen Filter setzen:
    Delphi-Quellcode:
    Query.Filter := 'Zeit >= ' + QuotedStr(TimeToStr(StundeStart) ' and Zeit < ' + QuotedStr(TimeToStr(StundeEnde));
    ... wobei für StundeStart und StundeEnde jeweils die TTime-Variablen StundeStart und StundeEnde auf z.B. 07:00:00 und 08:00:00 gesetzt und mit System.DateUtils.IncHour nach jedem Durchlauf erhöht werden.
  3. Nun für jede Stunde die Zeiten zwischen den Timestamps mit System.DateUtils.SecondsBetween ermitteln.
  4. Wenn Result > 600 (60 sec. x 10), dann Treffer.

jobo 16. Dez 2015 15:21

AW: Konzeptvorschlag
 
Zitat:

Zitat von Perlsau (Beitrag 1324643)
Nun für jede Stunde die Zeiten zwischen den Timestamps mit System.DateUtils.SecondsBetween ermitteln.[*]Wenn Result > 600 (60 sec. x 10), dann Treffer.

Mit dem Verfahren würden aber Pausen an den Stundengrenzen und auch darüber hinaus nicht gefunden.
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?

p80286 16. Dez 2015 15:28

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:
if timestamp[i]+600sec>timestamp[i+1] then writeln('Unterbrechung von '+timestamp[i]+' bis '+timestamp[i+1];
Gruß
K-H

Sir Rufo 16. Dez 2015 16:09

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:33 angefangen
    TagStundeArbeitszeitProduktivUnproduktivProduktiv %
    16.12.20150727121544,4%
  • Um 06:45 angefangen
    TagStundeArbeitszeitProduktivUnproduktivProduktiv %
    16.12.20150760124820,0%
Das gleiche Problem haben wir mit dem Ende der Arbeitszeit. Wann hat der Kollege denn den Hammer fallen lassen und ist nach Hause gegangen?
Um 07:53 oder erst gegen 16:00?
  • Um 07:33 angefangen und um 07:53 wieder nach Hause:
    TagStundeArbeitszeitProduktivUnproduktivProduktiv %
    16.12.20150720121560,0%
Dies muss geklärt werden, sonst misst man einfach nur Mist :stupid:

Perlsau 16. Dez 2015 16:53

AW: Konzeptvorschlag
 
Zitat:

Zitat von jobo (Beitrag 1324648)
Mit dem Verfahren würden aber Pausen an den Stundengrenzen und auch darüber hinaus nicht gefunden.

So hat's der TE vorgegeben, dafür darfst du nicht mich verantwortlich machen: "Aber es muss ja stundenweise zur vollen stunde die auswertung erfolgen."
Zitat:

Zitat von jobo (Beitrag 1324648)
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?

Richtig, wenn er das so haben wollte, sollte er das auch so formulieren. Ich hab ihn lediglich beim Wort genommen und ein Konzept streng nach seinen Vorgaben aufgestellt.

jobo 16. Dez 2015 17:16

AW: zeitintervall abfrage
 
Ja, ich glaube, dass er bei der Anforderungsdefinition noch nachlegen muss, ist klar. Fehlt nur noch eine Antwort vom TO.

MatthiasK 16. Dez 2015 17:34

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

jobo 16. Dez 2015 17:45

AW: zeitintervall abfrage
 
Ja und wie werden die Pausen nun auf die Stunden gelegt, wenn sie die volle Stunde schneiden?

MatthiasK 16. Dez 2015 19:30

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...

Perlsau 16. Dez 2015 19:44

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.

Dejan Vu 17. Dez 2015 06:56

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:
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
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.
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:
select m.Uhrzeit,
       i.Produktiv
from Minuten m join Intervalle i
 on m.Uhrzeit between i.StartZeit and i.EndZeit
Cool. Fehlt noch das Aggregat
Code:
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)
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.


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