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
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

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())