Zeitraum zwischen zwei Rows

Hallo,

ich habe eine Abfrage die mir verschiedene Zeiten auswirft:
select key_mitarbeiter,key_buchungsart,date(buchungszeit) As datum,time(buchungszeit) as Zeit from buchung where key_mitarbeiter=1644 order by datum
Ergebnis:
1644 Ge 2008-02-01 13:05:33
1644 Ko 2008-02-01 07:07:56

Jetzt gibt es für key_buchungsart jeweils eine Zeile für „Ko“=Kommen und „Ge“=Gehen, sprich einmal die Zeit, wann der Mitarbeiter gekommen und einmal, wann er gegangen ist, in dem Beispiel also um 07:07:56 gekommen und um 13:05:33 gegangen.

Hat jemand eine Idee, wie man die gesammte Anwesenheit (also von 07:07:56 bis 13:05:33) berechnen kann, also im Sinne von:
1644 2008-02-01 5:28

Danke,

Andre

Hallo Andre,
vermutlich trivial.
Aber:schau mal in die Brettbeschreibung und ergänze ein paar Angaben.
Gerade Datumsformate sind sehr datenbankabhängig.
muzel

Hi Muzel,

na ja, ist eine SAPDB 7.4 - eigentlich setzt die glaube ich sonst kein Mensch ein :smile:
Auch die Doku ist nicht so doll, daher hatte ich gehoft, man kann es vielleicht über ISO regeln.

Danke,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

(Ohne jetzt die Befehle „date“ und „time“ zu kennen - außer aus Deinem Select) - Versuchs mal mit

select a.key\_mitarbeiter,time(b.buchungszeit)-time(a.buchungszeit)
from buchung a,buchung b
where a.key\_mitarbeiter = b.key\_mitarbeiter
and date(a.buchungszeit)=date(b.buchungszeit)
and time(b.buchungszeit)\>time(a.buchungszeit)

ABER Vorsicht: Gibt’s mehrere Kommen und Gehen am Tag, funktioniert das hier nimmer;

Grüße,
Tomh

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Klasse, funktioniert leicht abgeändert - Danke.
select
a.key_mitarbeiter,timediff(b.buchungszeit,a.buchungszeit)
from buchung a,buchung b
where a.key_mitarbeiter = b.key_mitarbeiter and date(a.buchungszeit)=date(b.buchungszeit)
and time(b.buchungszeit)>time(a.buchungszeit)

SAP hat wohl Probleme mit dem Minus.
Kann man das auch noch gruppieren, falls für einen Tag tatsächlich mehrmals Kommen/Gehen vorhanden ist?

Gruß,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Andre,

Klasse, funktioniert leicht abgeändert - Danke.
select
a.key_mitarbeiter,timediff(b.buchungszeit,a.buchungszeit)
from buchung a,buchung b
where a.key_mitarbeiter = b.key_mitarbeiter and
date(a.buchungszeit)=date(b.buchungszeit)
and time(b.buchungszeit)>time(a.buchungszeit)

SAP hat wohl Probleme mit dem Minus.

Nö, für Zeitverarbetung gibt im SQL kein Standard

Kann man das auch noch gruppieren, falls für einen Tag
tatsächlich mehrmals Kommen/Gehen vorhanden ist?

Gruß,

Andre

Hallo Andre,

hier ist glaube ich erstmal wichtig überhaupt die Mitarbeiter zu finden, die mehrmals gegangen/gekommen sind. Dies ist der Fall, falls es eine Kombination gibt, deren Gehen-Zeit kleiner als die Kommen-Zeit ist (oder die Anzahl der Kombinationen pro Tag größer als 1). Das kann man ausnutzen sich diese Werte erstmal in eine getrennte Tabelle zu schreiben. Und falls Dein DB-System Subqueries kann, überleg Dir mal, ob man den Datensatz suchen, kann der den kleinsten nicht negativen Abstand zu „Kommen“-Datensatz besitzt. Und zum Testen bitte direkt einen Mitarbeiter simulieren, der dreimal Pausen gemacht hat :smile:.

MfG Georg V.

P.S.: Bitte grüße Wuppertal von mir und füll doch bitte Deine Visitenkarte aus, damit man Dir besser helfen kann.

Hi,

Und zum Testen bitte
direkt einen Mitarbeiter simulieren, der dreimal Pausen
gemacht hat :smile:.

…und natürlich auch den Operator nicht vergessen, der immer von 22:00 - 06:00 da ist, sowie den Kollegen, der immer vergisst, beim Gehen zu stechen, und dann auch noch denjenigen, der genau bei der Sommerzeitumstellung kam/ging *g*.

Das Problem bei solchen Queries ist, dass man in SQL wohl kaum eine Fehlerbehandlung unterbringt (was insbesondere beim zweiten Fall wohl zwingend notwendig ist, beim ersten und dritten tut’s auch eine Fallunterscheidung).

Ich würde sowas immer nur prozedural machen, ich weiss nur leider nicht, ob das für den OP eine Option ist…

Gruß
Martin