Seite 1 von 1

Alter bestimmen

Verfasst: 09.03.2015 11:38
von marcelx
Hallo,

ich habe eine Datum als Text mit folgende Format: <Tag>.<Monat>.<Jahr> (z.B. "23.02.1888")
wie berechne ich das Alter bezogen auf das Datum von Heute?

Danke und Gruß
MarcelX

Re: Alter bestimmen

Verfasst: 09.03.2015 12:41
von Bisonte
Einfach das Geburtsdatum hochzählen, bis das heutige Datum erreicht ist.
Mal einfach so hingekritzelt....

Code: Alles auswählen

Procedure Alter_Ausrechnen(Date)
  
  Protected Heute = Date()
  Protected Result = 0, tmp = date
  
  ; Datum hochzählen
  While Heute >= tmp
    tmp = AddDate(tmp, #PB_Date_Year, 1)
    Result + 1
  Wend
  
  ; Falls Geburtsdatum innerhalb des Jahres noch nicht erreicht ist...
  If tmp > Date
    Result - 1
  EndIf
  
  ProcedureReturn Result
    
EndProcedure

Datum = Date(1980, 3, 10, 0, 0, 1)

Debug Alter_Ausrechnen(Datum)

Re: Alter bestimmen

Verfasst: 09.03.2015 12:55
von marcelx
Danke für den Ansatz; leider dauert es ewig mit z:B. das Jahr 1888

Ich habe gerade mit eine DB-Lösung probiert und funktioniert:

Code: Alles auswählen

UseSQLiteDatabase()

Enumeration : #Database : EndEnumeration

OpenDatabase(#Database, ":memory:", "", "", #PB_Database_SQLite)

Procedure.s RechneAlter(String$)
  Debug String$
  If DatabaseQuery(#Database, "SELECT cast(strftime('%Y.%m%d', 'now') - strftime('%Y.%m%d', '"+String$+"') as int)")
    If NextDatabaseRow(#Database)
      ProcedureReturn GetDatabaseString(#Database, 0)
    EndIf
    FinishDatabaseQuery(#Database)
  EndIf
EndProcedure 

Debug RechneAlter("1888-03-10")

CloseDatabase(#Database)

Re: Alter bestimmen

Verfasst: 09.03.2015 13:00
von NeoChris
@Bisonte
Die Schleife finde ich unnötig. Du kannst zwei Daten (Plural von Datum) auch subrahieren.

Code: Alles auswählen


Procedure Alter_Ausrechnen(Date)
 
  Protected Heute = Date()
  Protected Result = 0, tmp = date
 
  Result = Year(Heute)-Year(Date)
  
  ; hier noch -1-Abfrage einfügen ob man im letzten Jahr schon Geburtstag hatte!
  
  ProcedureReturn Result
   
EndProcedure

Datum = Date(1980, 3, 10, 0, 0, 1)

Debug Alter_Ausrechnen(Datum)


Re: Alter bestimmen

Verfasst: 09.03.2015 13:14
von marcelx
mit Date(1888, 3, 10, 0, 0, 1) ergibt bei Debug Alter_Ausrechnen(Datum) 2015
(weil Datum ist = -1)

Re: Alter bestimmen

Verfasst: 09.03.2015 13:15
von ProgOldie
Bisontes Lösung setzt voraus, dass das Geburtsdatum zwischen dem 1.1.1970 und dem 19.1.2038 liegt, weil die PB-Bibliothek nur Daten im UNIX-Format verarbeitet. Mit dem von MarcelX vorgegebenen Jahr 1888 geht es also schon 'mal nicht.

Dann muss man per Hand vorgehen. Wenn Tag, Monat, Jahr die vorgegebenen Datumsteile sind, erhält man schon 'mal ohne Iteration mit

Code: Alles auswählen

Alter=year(Date())-Jahr

einen Wert für das Alter in Jahren, der nur dann falsch ist, wenn der Geburtstag im aktuellen Jahr noch nicht erreicht wurde. Also muss man noch prüfen, ob der Geburtstag im aktuellen Jahr erreicht wurde.

Monat < month(Date()) Dann Alter um 1 verringern
Monat =month(Date()) Dann prüfen of Tag <day(Date()) Wenn ja, dann Alter um 1 verringern.

Re: Alter bestimmen

Verfasst: 09.03.2015 13:16
von Kiffi
Die PB-Datumsfunktionen reichen nur bis zum 01.01.1970 zurück.

Wer mit älteren Werten rechnen möchte, der muss wohl oder übel Alternativen suchen (hier und im englischen Forum gibt es bereits entsprechende Routinen).

Die SQLite-Alternative gefällt mir allerdings auch ganz gut...

Grüße ... Peter

Re: Alter bestimmen

Verfasst: 09.03.2015 16:36
von Bisonte
ARg... Da hatte ich wieder mal nicht dran gedacht... 1970.... >_<
Das mit dem einfach abziehen macht auch Sinn, aber das erste, was mir beim
Lesen einfiel war die Schleife.... ;)

Aber die SQL Geschichte find ich höchst interessant :allright:

Re: Alter bestimmen

Verfasst: 10.03.2015 16:37
von ProgOldie
Hatte gerade nicht Besseres zu tun.

Code: Alles auswählen

EnableExplicit

Procedure getAlter(Tag.i,Monat.i,Jahr.i)
  Protected.i Alter
  Alter=Year(Date())-Jahr
  If Alter >0   ; Geburtsjahr=aktuelles Jahr-->Alter immer 0
    If Monat > Month(Date())
      Alter-1
    ElseIf Monat=Month(Date())
      If Tag<Day(Date())
        Alter-1
      EndIf
    EndIf
  EndIf
  ProcedureReturn Alter
EndProcedure


MessageRequester("errechnetes Alter",Str(getAlter(23,2,1888)))

//Edited : Falsche Abfrage behoben: If Monat > Month(Date())