Berechnen von Zeiten
KlausWerther
Gesendet: 19.08.20 14:16
Betreff: RE: Berechnen von Zeiten


Member

Beiträge: 41
25
Ort: Isernhagen (bei Hannover)
Ein Nachtrag noch:

Generell ist zu berücksichtigen, dass bei jedem Datentyp mit Fließkomma (dazu zählt auch Datum/Uhrzeit) alle Werte nur Näherungen an die gewünschten Werte sind und jegliche arithmetische Operation den Fehler immer größer werden lässt.

Bei großen Mengen von Einzelwerten, die aufsummiert werden sollen, wird irgendwann der Gesamtfehler beim Aufsummieren der Flugzeiten so groß, dass auch die vorgeschlagene Lösung mit der Rundung nicht mehr hilft.

Um das zu umgehen, kann man auf Festkomma-Datentypen oder Ganzzahl-Datentypen wechseln. Allerdings auch hier ist nicht jede Zahl darstellbar. Aber jedenfalls entspricht die Repräsentation der Werte, den eingegebenen Werten.

Hier ist nun die korrekte Datenmodellierung entscheidend. Mit welcher Genauigkeit werden denn die Daten überhaupt erfasst? Mit welcher Genauigkeit soll die Auswertung erfolgen? Passen diese Anforderungen überhaupt zueinander? Welcher Datentyp eignet sich dafür?

Beispiel: Wenn minutengenau erfasst wird und die auch die Auswertegenauigkeit nicht genauer sein muss, dann eignet sich ein Ganzzahl-Datentyp wie Long Integer für die Anzahl der Minuten. Hier könnte die eigentliche Erfassung einer Startzeit und Endzeit zwar als DateTime (Datum/Uhrzeit) erfolgen, die errechnete Flugzeit hingegen sollte dann in ganzen Minuten gespeichert oder temporär für die Berechnungen herangezogen werden:
lngFlugzeitInMinuten = DateDiff("n", dtmStartzeit, dtmEndzeit)

Die Funktion DateDiff liefert einen Variant mit Untertyp Long zurück. Diese Werte können also ohne Fehler beliebig aufsummiert werden, sofern die Grenzen des Wertebereichs eingehalten werden. Und so sollte der Wert auch in der Tabelle als Long Integer oder in VBA-Code in einer Variablen vom Typ Long gespeichert und verwendet werden.

Die formatierte Darstellung ergibt sich so:
strFlugzeitInStunden = Format(lngFlugzeitInMinuten \ 60, "00") & ":" & Format(lngFlugzeitInMinuten mod 60, "00")

Das ist auch die bessere Lösung, gegenüber der zuvor vorgeschlagenen Rundung. Aber nur in diesem Beispiel-Szenario.


Das richtige Vorgehen hängt natürlich von Deinem konkreten Anwendungsfall ab.


--
Gruss, Klaus
Top of the page Bottom of the page