Supportnet / Forum / Datenbanken
Zeiten berechnen
Frage
Hallo alle miteinander,
ich kämpfe mich so langsam durch die Anfänge und möchte aus einer Tabelle mit den Feldern Uhrzeit von / Uhrzeit bis eine Abfrage erstellen um die Arbeitszeit angezeigt zu bekommen.
Durch das Format in der Tabelle (00:00;0;_) bekomme ich keine richtige Berechnung, aber ein Zahlenformat würde auch nicht funktionieren. Gibt es da, wie bei Access ein Benutzerdefiniertes Format?
Bin dankbar für jeden Hinweis.
Antwort 1 von Armin
hi,
ich konvertiere meine Uhrzeiten in einen Long oder double wert, indem ich aus der Angabe "hh:mm:ss" einen long wert (Anzahl der sekunden) berechne.
Mit diesem Wert führe ich alle Berechnungen durch und konvertiere hinterher wieder zurück.
gruss armin
ich konvertiere meine Uhrzeiten in einen Long oder double wert, indem ich aus der Angabe "hh:mm:ss" einen long wert (Anzahl der sekunden) berechne.
Mit diesem Wert führe ich alle Berechnungen durch und konvertiere hinterher wieder zurück.
gruss armin
Antwort 2 von Loongli
Hallo Armin,
danke für den Tip. Wenn du einem Anfänger noch kurz erläutern könntest wie man die Zeiten konvertiert wäre ich dir wirklich dankbar.
Gruß Longli
danke für den Tip. Wenn du einem Anfänger noch kurz erläutern könntest wie man die Zeiten konvertiert wäre ich dir wirklich dankbar.
Gruß Longli
Antwort 3 von Armin
hi,
ich habe zwei funktionen aus dem Buch "Das Access-VBA codebook" von Grieshammer, et. al. verwendet, die ich leicht modifiziert habe.
Damit können dann auch Zeitdauer von zb 34:00:00 berechnet werden.
gruesse armin
ich habe zwei funktionen aus dem Buch "Das Access-VBA codebook" von Grieshammer, et. al. verwendet, die ich leicht modifiziert habe.
Public Function ConvertDoubleToStrTime( _
ByVal dblTime As Double) As String
Dim dblHours As String
Dim dblMinutes As String
Dim dblSeconds As String
Dim strSgn As String
´Ermitteln der Vorzeichen
If dblTime < 0 Then
strSgn = "-"
dblTime = dblTime * -1
Else
strSgn = " "
End If
dblHours = dblTime 3600
dblMinutes = (dblTime - (dblTime 3600) * 3600) 60
dblSeconds = ((dblTime - ((dblTime 3600) * 3600) - (((dblTime - (dblTime 3600) * 3600) 60) * 60)) 60)
´Rückgabe der einzelnen Werte als Double-Wert
ConvertDoubleToStrTime = strSgn & Format(dblHours, "00") & ":" & Format(dblMinutes, "00") ´& ":" & Format(dblSeconds, "00")
End Function
Public Function ConvertStrTimeToDouble( _
ByVal strTime As String) As Double
Dim arrTime() As String
Dim dblHours As Double
Dim dblMinutes As Double
Dim dblSeconds As Double
Dim dblTemp As Double
Dim dblSgn As Double
´Einfügen eines Error-Traps, falls die Zeitstrings
´nicht alle Informationen erhalten.
´Split würde ansonsten Fehler zurückgeben.
On Error Resume Next
´Aufsplitten der ersten Zeit an den Doppelpunkten
arrTime = Split(strTime, ":")
dblHours = arrTime(0)
dblMinutes = arrTime(1)
dblSeconds = arrTime(2)
´Ermitteln der Vorzeichen
If Left(strTime, 1) = "-" Then
dblSgn = -1
Else
dblSgn = 1
End If
on errror goto 0
´Rückgabe der einzelnen Werte als Double-Wert
ConvertStrTimeToDouble = dblSgn * (Abs(dblHours) * 3600# + _
dblMinutes * 60# + dblSeconds)
End Function
Damit können dann auch Zeitdauer von zb 34:00:00 berechnet werden.
gruesse armin
Antwort 4 von Loongli
Danke für die Info und Grüße
Antwort 5 von Knubbel
Hi Loongli,
wenn auch nicht so elegant, wie mit einem VBA-Code, aber dennoch funktionsfähig:
Ich habe eine DB zu einer Fuhrparkverwaltung mit folgenden Datenfeldern:
[Datum] Format Datum,kurz
[Abfahrtzeit] Format Zeit,24 Std
[geschätzte Abwesenheit] Format Zahl, Single
[Rückkehr-Datum] Format Datum, kurz
[Rückkehr-Zeit] Format Zeit, 24 Std
Ziel der von mir erstellten Abfrage: Die Abwesheit der Fahrzeuge ermitteln. Die Abwesnheit kann dabei durchaus über mehrere Tage gehen. Wenn ein Fahrzeug noch nicht wieder zurück ist, soll für die Abwesenheit die "geschätzte Abwesenheit" eingesetzt werden.
Außer den o.g. Datenfeldern enthält meine Abfrage noch folgende berechneten Felder:
AB-Zeit: [Datum]+[Abfahrtzeit]
AK-Datum: Wenn([Rückkehr-Datum] Ist Null;[Datum];[Rückkehr-Datum])
Ankunft-Zeit: Wenn([Rückkehr-Zeit] Ist Null;[AB-Zeit]+[geschätzte-Abwesenheit]/24;[AK-Datum]+[Rückkehr-Zeit])
Einsatzdauer: ([Ankunft-Zeit]-[AB-Zeit])*24
Die Einatzdauer wird in Dezimalstunden ausgegeben.
Vielleicht hilft dir das ja.
mfg Knubbel
wenn auch nicht so elegant, wie mit einem VBA-Code, aber dennoch funktionsfähig:
Ich habe eine DB zu einer Fuhrparkverwaltung mit folgenden Datenfeldern:
[Datum] Format Datum,kurz
[Abfahrtzeit] Format Zeit,24 Std
[geschätzte Abwesenheit] Format Zahl, Single
[Rückkehr-Datum] Format Datum, kurz
[Rückkehr-Zeit] Format Zeit, 24 Std
Ziel der von mir erstellten Abfrage: Die Abwesheit der Fahrzeuge ermitteln. Die Abwesnheit kann dabei durchaus über mehrere Tage gehen. Wenn ein Fahrzeug noch nicht wieder zurück ist, soll für die Abwesenheit die "geschätzte Abwesenheit" eingesetzt werden.
Außer den o.g. Datenfeldern enthält meine Abfrage noch folgende berechneten Felder:
AB-Zeit: [Datum]+[Abfahrtzeit]
AK-Datum: Wenn([Rückkehr-Datum] Ist Null;[Datum];[Rückkehr-Datum])
Ankunft-Zeit: Wenn([Rückkehr-Zeit] Ist Null;[AB-Zeit]+[geschätzte-Abwesenheit]/24;[AK-Datum]+[Rückkehr-Zeit])
Einsatzdauer: ([Ankunft-Zeit]-[AB-Zeit])*24
Die Einatzdauer wird in Dezimalstunden ausgegeben.
Vielleicht hilft dir das ja.
mfg Knubbel
Antwort 6 von Armin
@ Knubbel,
sieht gut aus, bekommst du als Einsatzdauer auch Stunden über 24 h heraus ?
gruesse armin
sieht gut aus, bekommst du als Einsatzdauer auch Stunden über 24 h heraus ?
gruesse armin
Antwort 7 von Knubbel
Hi Armin,
ja!
Habe ich aber bereits in meiner Antwort erwähnt.
mfg Knubbel
ja!
Habe ich aber bereits in meiner Antwort erwähnt.
mfg Knubbel
Antwort 8 von Knubbel
@ Armin
Leg doch mal eine Tabelle an mit den von mir bezeichneten 5 Datenfeldern.
Anschließend gestalte eine Abfrage mit meinen geposteten "berechneten" Feldern.
Der Zeitaufwand ist sicher nicht groß. Beim Testen der Abfrage kannst du ja selbst feststellen, dass das Ergebnis alles erfüllt.
mfg Knubbel
NS: Ich habe keine Prüfroutine eingebaut, die überprüft, dass Ankunftzeit größer als Abfahrzeit ist.
Leg doch mal eine Tabelle an mit den von mir bezeichneten 5 Datenfeldern.
Anschließend gestalte eine Abfrage mit meinen geposteten "berechneten" Feldern.
Der Zeitaufwand ist sicher nicht groß. Beim Testen der Abfrage kannst du ja selbst feststellen, dass das Ergebnis alles erfüllt.
mfg Knubbel
NS: Ich habe keine Prüfroutine eingebaut, die überprüft, dass Ankunftzeit größer als Abfahrzeit ist.
Antwort 9 von Loongli
Hallo Leute,
vielen Dank für die rege Beteiligung. Ich konnte mich leider nicht eher melden, da es Freenet wieder einmal nicht für nötig hielt seine DSL Kunden mit dem WWW zu verbinden :-(
Der Tip von Knubbel ist für für mich wesentlich leichter nachzuvollziehen, da ich mich im Selbststudium "reinwurstle".
Eine Einsatzdauer >24h benötige ich auch nicht.
Vielen Dank dafür.
vielen Dank für die rege Beteiligung. Ich konnte mich leider nicht eher melden, da es Freenet wieder einmal nicht für nötig hielt seine DSL Kunden mit dem WWW zu verbinden :-(
Der Tip von Knubbel ist für für mich wesentlich leichter nachzuvollziehen, da ich mich im Selbststudium "reinwurstle".
Eine Einsatzdauer >24h benötige ich auch nicht.
Vielen Dank dafür.
Antwort 10 von Knubbel
Hi Loongli,
danke für die Rückmeldung.
Für dein Problem (wenn Zeitdifferenzen nur innerhalb eines Tages berechnet werden sollen) - so habe ich deine Frage verstanden - reicht auch folgende Abfrage:
In der Tabelle sind folgende Felder vorhanden:
[Von_Zeit] Felddatentyp Datum/Uhrzeit Format Zeit, 24 Std
[Bis_Zeit] Felddatentyp Datum/Uhrzeit Format Zeit, 24 Std
Nun erstellst du eine Abfrage mit diesen beiden Datenfelder, und gibst als 3. ("berechnetes") Datenfeld
ein:
Arbeitszeit: ([Bis_Zeit]-[Von_Zeit])*24
Das Ergebnis wird dann in Dezimalstunden dargestellt.
Die Multiplikation mit 24 ist notwendig, da hier ja nur Stunden-Differenzen berechnet werden sollen. MS rechnet aber Datum/Zeit in Tagen, wobei die Stundenwerte als Dezimalstellen dargestellt werden.
mfg Knubbel
NS: Wenn du weitere Fragen hast, bitte melden.
danke für die Rückmeldung.
Für dein Problem (wenn Zeitdifferenzen nur innerhalb eines Tages berechnet werden sollen) - so habe ich deine Frage verstanden - reicht auch folgende Abfrage:
In der Tabelle sind folgende Felder vorhanden:
[Von_Zeit] Felddatentyp Datum/Uhrzeit Format Zeit, 24 Std
[Bis_Zeit] Felddatentyp Datum/Uhrzeit Format Zeit, 24 Std
Nun erstellst du eine Abfrage mit diesen beiden Datenfelder, und gibst als 3. ("berechnetes") Datenfeld
ein:
Arbeitszeit: ([Bis_Zeit]-[Von_Zeit])*24
Das Ergebnis wird dann in Dezimalstunden dargestellt.
Die Multiplikation mit 24 ist notwendig, da hier ja nur Stunden-Differenzen berechnet werden sollen. MS rechnet aber Datum/Zeit in Tagen, wobei die Stundenwerte als Dezimalstellen dargestellt werden.
mfg Knubbel
NS: Wenn du weitere Fragen hast, bitte melden.
Antwort 11 von Loongli
Danke, habe ich bereits so gelöst und es funktioniert.
Der Hinweis "*24" war exakt das was mir fehlte, und was ich auch nirgends gefunden habe.
Jetzt komme ich erst einmal weiter.
Der Hinweis "*24" war exakt das was mir fehlte, und was ich auch nirgends gefunden habe.
Jetzt komme ich erst einmal weiter.
Antwort 12 von Loongli
Da hätte ich doch gleich noch eine Frage.
Ich habe jetzt eine Tabelle mit den Feldern Personalnummer, Name, Tag, Monat, Arbeitszeit von und Arbeitszeit bis. In einer Abfrage bekomme ich die Arbeitszeit berechnet.
Wie baue ich die DB am einfachsten auf, dass ein Anwender welcher noch weniger Ahnung hat als ich (ich arbeite ja dran) die Arbeitszeit pro Mitarbeiter und Monat angezeigt bekommt?
Die Struktur würde mir reichen, den Rest bastle ich mir dann zusammen!
Ich habe jetzt eine Tabelle mit den Feldern Personalnummer, Name, Tag, Monat, Arbeitszeit von und Arbeitszeit bis. In einer Abfrage bekomme ich die Arbeitszeit berechnet.
Wie baue ich die DB am einfachsten auf, dass ein Anwender welcher noch weniger Ahnung hat als ich (ich arbeite ja dran) die Arbeitszeit pro Mitarbeiter und Monat angezeigt bekommt?
Die Struktur würde mir reichen, den Rest bastle ich mir dann zusammen!
Antwort 13 von Knubbel
Hi Loongli.
Wenn ich es richtig verstehe, sind in deiner Abfrage alle Datenfelder und das berechnete Feld Arbeitszeit enthalten? Wenn Ja, dann
erstelle eine neue Abfrage. Als Datenquelle wählst du die 1. Abfrage. Hier wählst du die Datenfelder Personalnummer, Monat und Arbeitszeit aus.
Mit Klick auf das Sumenzeichen in der Menüleiste schaltest du die zusätzliche Zeile "Funktion" in der Abfrage ein. Hier wählst du nun bei
* Personalnummer = Gruppierung
* Monat = Gruppierung
* Arbeitszeit = Summe
Und schon hast du für jeden Mitarbeiter die Monatsarbeitszeit für jeden Monat.
mfg Knubbel
Wenn ich es richtig verstehe, sind in deiner Abfrage alle Datenfelder und das berechnete Feld Arbeitszeit enthalten? Wenn Ja, dann
erstelle eine neue Abfrage. Als Datenquelle wählst du die 1. Abfrage. Hier wählst du die Datenfelder Personalnummer, Monat und Arbeitszeit aus.
Mit Klick auf das Sumenzeichen in der Menüleiste schaltest du die zusätzliche Zeile "Funktion" in der Abfrage ein. Hier wählst du nun bei
* Personalnummer = Gruppierung
* Monat = Gruppierung
* Arbeitszeit = Summe
Und schon hast du für jeden Mitarbeiter die Monatsarbeitszeit für jeden Monat.
mfg Knubbel
Antwort 14 von Loongli
Suuper,
genauso habe ich mir das vorgestellt!!
Danke für die leicht verständliche Antwort.
schönes Wochenende
genauso habe ich mir das vorgestellt!!
Danke für die leicht verständliche Antwort.
schönes Wochenende

