Januar 20, 2021, 13:55:08

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Alter in Monaten berechnen

Begonnen von Kubus0815, Januar 07, 2021, 13:38:41

⏪ vorheriges - nächstes ⏩

Kubus0815

Hallo zusammen.

ich berechne anhand dieses Ausdrucks das Alter in Monaten meiner Tiere:

Alter: DatDiff("m";[GebDatum];Jetzt())

Leider rundet Access nun entgegen excel das Alter meiner Tiere auf.
Wie kann das verhindert werden.
Noch schöner wäre das Alter in Monaten und Tagen.
Kann mir da jemand weiterhelfen?

Schon mal Vielen Dank
Thomas

HB9876

Hi,
mach das "d" fur days (tage) dazu.
Mit jeder Antwort komme ich weiter und lerne.

Danke!!!

Kubus0815

Hallo,
kannst du mir das noch ein bisschen näher erläutern.
Wo machst du das "d" dazu.

Gruß Thomas


Kubus0815

Hallo nochmal.
Ich komme hier nicht so recht weiter.
Der Link auf donkarls Seite zum Microsoft Support funktioniert leider nicht mehr.
Ich denke ich habe es hier https://docs.microsoft.com/de-de/office/vba/access/concepts/date-time/calculate-age wiedergefunden.
Ich habe nun Code im VBA Editor unter (Allgemein) hinzugefügt und die Variable StartDate durch GebDatum aus meiner Abfrage ersetzt.
Public Function AgeMonths(ByVal GebDatum As String) As Integer
 Dim tAge As Double
 tAge = (DateDiff("m", GebDatum, Now))
 If (DatePart("d", GebDatum) > DatePart("d", Now)) Then
 tAge = tAge - 1
 End If
 
 If tAge < 0 Then
 tAge = tAge + 1
 End If
 
 AgeMonths = CInt(tAge Mod 12)
 
 End Function

Mit
VBA: AgeMonths([GebDatum]) wollte ich den Ausdruck starten, nun bekomme ich die Fehlermeldung
"Undefinierte Funktion AgeMonths in Ausdruck.

Ich hoffe meine Herangehensweise passt einigermaßen.

Schon mal Danke
Thomas

ebs17

Zitateinigermaßen
... ist in der Auslegung sehr relativ ...

Du solltest Dich eingangs stärker mit Datentypen beschäftigen.
DateDiff erwartet als zweites und drittes Argument Date-Werte. GebDatum da als String anzuliefern ist schon ein grober Fehler.

Die Rückgabe von DateDiff ist faktisch wie auch aus der Definition heraus eine Ganzzahl. Warum soll da eine Double-Variable diese Rückgabe entgegennehmen?

Wenn Du dann syntaxfehlerfrei durchkommst, wirst Du doch selber beurteilen können, ob das Ergebnis Deinen Erwartungen entspricht.
Mit freundlichem Glück Auf!

Eberhard

Kubus0815

Hallo Eberhard.
ZitatDateDiff erwartet als zweites und drittes Argument Date-Werte. GebDatum da als String anzuliefern ist schon ein grober Fehler.
Die Rückgabe von DateDiff ist faktisch wie auch aus der Definition heraus eine Ganzzahl. Warum soll da eine Double-Variable diese Rückgabe entgegennehmen?
Mir ist das auch schon komisch vorgekommen, so steht es aber in der Microsoft Support Vorlage und da ich nicht wirklich Ahnung habe....

ebs17

... selbst bei seinem Gott sollte man ein gesundes Stück Restmissvertrauen haben ...
Mit freundlichem Glück Auf!

Eberhard

Kubus0815

Januar 13, 2021, 13:17:19 #8 Letzte Bearbeitung: Januar 13, 2021, 13:32:25 von Kubus0815
So jetzt kann ich zumindest die Monate richtig berechnen.
Ich habe ein Modul mit folgendem Code angelegt und rufe dieses in einem Ausdruck auf:

Function Age(GebDatum As Date) As Integer
   Dim varAge As Integer

varAge = DateDiff("m", GebDatum, Now)
  If Day(GebDatum) > Day(Now) Then
  varAge = varAge - 1
     
    End If
   Age = varage
End Function

Ich würde mir nun noch gerne in einem weiteren Ausdruck die Tage des Alters anzeigen lassen.
Ist der Tag des Geburtstags < als der Tag heute ist das ja noch einfach, dazu müsste ich nur beide Tage voneinander abziehen.
Wie macht mann das aber wenn das Ergebnis praktisch ins negative geht?

ebs17

Idee:

Da Monate unterschiedlich viele Tage haben, ist dann eine zusätzliche Tagesberücksichtigung alles andere als mathematisch exakt. Da könnte man sich gleich insgesamt auf die Tagesdifferenz orientieren, das wäre dann wieder präzise. Überblicksweise könnte man für den Monat 30 Tage annehmen und sich also die Monats- + Tagesdarstellung herleiten aus einer Ganzzahlendivision:
Monate = Tagesdifferenz \ 30
Tage = Tagesdifferenz mod 30
Mit freundlichem Glück Auf!

Eberhard

Kubus0815

So mit der Ganzzahldivision bekam ich sehr große Abweichungen.
Ich habe jetzt folgende Funktion erstellt:
Function Tage(GebDatum As Date) As Integer
   Dim varTage As Integer

varTage = Day(Now) - Day(GebDatum)
  If varTage < 0 Then
    varTage = 30 - (Day(GebDatum) - Day(Now))
    End If
   Tage = varTage
End Function

Damit nähere ich mich dem Ergebnis +-1Tag das reicht mir