Supportnet Computer
Planet of Tech

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

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

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.



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

Antwort 6 von Armin

@ Knubbel,

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

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.

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.

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.

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.

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!

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

Antwort 14 von Loongli

Suuper,

genauso habe ich mir das vorgestellt!!
Danke für die leicht verständliche Antwort.

schönes Wochenende

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: