# Alter berechnen aus Datenbank Datum



## jc-freak (13. April 2004)

Ich würde gerne das Datum aus einer Datenbank auslesen und daraus dann das Alter berechnen.

Also z.B.: 

Datenbank:                   Datum = 1.1.2002

Sollte dann rauskommen :       Alter = 2 Jahre

Wie mache ich das mit PHP und MySQL ?
Timestamps?


----------



## ludz (13. April 2004)

Quäl mal die Suche mit alter und / oder geburtstag. Da sollte einiges bei rauskommen.


----------



## jc-freak (13. April 2004)

jo alles klar hatte unter alter gesucht und nichts gefunden unter geb ja thx


----------



## steff aka sId (13. April 2004)

Dafür wäre es recht praktisch wenn du das Datum in der Datenbank als Unix Timestamp hättest. Dafür gibt es einige Php Funktionen. Dann müsstest du nur noch den Timestamp der aktuellen Zeit bzw. Datums auslesen und könntest dann aus den beiden Werten das Alter errechnen. Hab leider kein Script dafür müsste ich mir erst schreiben aber vieleicht hilft dir das schon weiter. Die Methoden dafür findest du bei Self-php.
Greetz Steff


----------



## Tim C. (13. April 2004)

> _Original geschrieben von steff aka sId _
> *Dafür wäre es recht praktisch wenn du das Datum in der Datenbank als Unix Timestamp hättest. Dafür gibt es einige Php Funktionen. Dann müsstest du nur noch den Timestamp der aktuellen Zeit bzw. Datums auslesen und könntest dann aus den beiden Werten das Alter errechnen. Hab leider kein Script dafür müsste ich mir erst schreiben aber vieleicht hilft dir das schon weiter. Die Methoden dafür findest du bei Self-php.
> Greetz Steff *


Ist leider etwas problematisch wenn du Leute in der Datebank hast, die vor dem 1.1.1970 geboren sind.


----------



## steff aka sId (13. April 2004)

stimmt das hab ich nicht bedacht


----------



## melmager (13. April 2004)

hmmm was habt Ihr nur alle gegen die Datumfunctionen in Mysql ?

Ich glaube ich muss da mal ein Tutorial dazu schreiben


----------



## ludz (13. April 2004)

*dafür bin*  (ich brauche / verwende sie zwar eigentlich nicht, aber man lernt ja nie aus und iteressieren würden sie mich schon - zum Stöbern in der MySQL-Doku hab ich keine richtige Motivation eigentlich)


----------



## SilentWarrior (13. April 2004)

> Ist leider etwas problematisch wenn du Leute in der Datebank hast, die vor dem 1.1.1970 geboren sind.


Mal abgesehen davon, dass solche "Grufties" im Internet eh nix verloren haben (): Wo liegt denn da genau das Problem? Man kann doch in eine integer-Spalte auch Negativwerte eintragen oder nicht? Also z. B. für Geburtsdatum 1.1.1969 Timestamp -31536000 ... oder hab ich da irgendwo nen Denkfehler?


----------



## Karl Förster (13. April 2004)

Also ich benutze zur Altersberechnung seit einiger Zeit folgende Funktion in MySQL ... funktionier tadellos mit einem DATETIME-Feld:


```
$sql = "SELECT ".
      "(YEAR(CURRENT_DATE) - YEAR(Datum)) - ".
      "(RIGHT(CURRENT_DATE,5) < RIGHT(Datum,5)) AS age ".
      "FROM tabelle";

// usw.
```


----------



## proloser (28. August 2004)

Am einfachsten ist es so 


```
$tag = "01";
$monat = "05";
$jahr = "1975";

$time = mktime(0,0,0,date("m"),date("d"),date("Y")); 
$birthday = mktime(0,0,0,$monat,$tag,$jahr); 
$alter   = intval(($time - $birthday) / (3600 * 24 * 365));

echo "$alter";
```

mfg


----------



## Daensch (7. September 2004)

das script is ganze nett =)

nur wie liest du aus der Datenbank die Daten aus und gebrauchst sie?

```
<?
$id = 1;  // Über ID Abfragen is immer noch das beste !
$tabelle = "Geburtstagstabelle";
$sql1 = "SELECT tag FROM ".$tabelle." WHERE `id`=".$id.")"; 
$sql2 = "SELECT monat FROM ".$tabelle."  WHERE `id`=".$id.")"; 
$sql3 = "SELECT jahr FROM ".$tabelle."  WHERE `id`=".$id.")"; 

$tag = mysql_query($sql1);
$monat = mysql_query($sql2);
$jahr = mysql_query($sql3);

dein script
?>
```

das setzt aber vorraus das ich für tag monat und jahr jeweils eine spalte habe !
Würde das nich irgendwie gehen mit  explode befehlen!?
die z.b. einen "1-1-1970" tag aufteilen würden ?! // wer dazu ne idee hat, würde mir zumindest sehr helfen

PS:  Falls hier irgendwelche Denkfehler vorhanden sind. ich kanns (oda auch nich) erst seit knapp ner Woche relativ gut =).. es sei mir bitte verziehen..


----------



## Tim C. (7. September 2004)

Wie man den [phpf]explode[/phpf] Befehl nutzt wirst du ja wohl grade noch selber raussuchen können, oder?


----------



## Gumbo (7. September 2004)

Ich schließe mich Karl Försters Vorschlag an – dieser wird übrigens auch im MySQL-Referenzhandbuch erwähnt:
&nbsp;*&rsaquo;**&rsaquo;*&nbsp;MySQL Manual | 4.3.4.5 Datumsberechnungen


----------



## LRK (8. September 2004)

> _Original geschrieben von proloser _
> *Am einfachsten ist es so
> 
> *
> ...


, aber kann mir das jemand erläutern?


----------



## saila (8. September 2004)

> _Original geschrieben von Karl Förster _
> *Also ich benutze zur Altersberechnung seit einiger Zeit folgende Funktion in MySQL ... funktionier tadellos mit einem DATETIME-Feld:
> 
> *
> ...



Abgesehen davon das dies funktionieren mag, wenn man die DB danach aufbaut, so finde ich das ganze für "Layen" etwas extrem.

Ich verstehe nicht, warum man nicht einfach die DB wie folgt abfragt:


```
<?php
// das Jahr 2004 festlegen. Ändert sich automatisch auf 2005, wenn wir 2005 hätten.
$year = date("Y");

// DB - Auftrag - vorausgesetzt du hast id auch auf index eingestellt.
$res = mysql_query("SELECT id, name, geb FROM tabelle ORDER BY id");

// Ergebnis der DB-Abfrage ausgeben
while($ergebnis = mysql_fetch_object($res)) {

// Vereinfachen der Schreibe - nur dann, wenn es mehr Spalten sind ;)
   $id = $ergebnis->id;
   $na = $ergebnis->name;

// Das Geburtsdatum aus der Tabelle (geb) aufteilen um das Jahr zu ermitteln
   $ja = explode("-", $ergebnis->geb);

// Ausgabe des Array von explode ist an erster Stelle (0) das Jahr.
   $jahr = $ja[0];

// einfache Jahresberechnung - ausgehend vom heutigen Jahr abzüglich Geburtsjahr
   $alter = $year - $jahr;

// Ausgabe der Daten.......
   echo "$id&nbsp;$na&nbsp;$alter<br>";
}
?>
```

Wo ist darin nun das Problem? Mehr als die Jahre kann man nicht berechnen und wenn man es genau haben will mit Zeit und vollständigem Datum muss man eben mktime bemühen. All das kann man im Manual nachlesen von PHP und wenn du das nicht hast, klick mal auf die Links in der Signatur. 

Es gibt aber neben dieser Möglichkeit noch andere....... ist also nur des Verständnis halber so aufgebaut............lese und lerne..........


----------



## Gumbo (8. September 2004)

In deinem Beispiel werden die Menschen alle am Neujahrstag ein Jahr älter, saila.


----------



## Sven Petruschke (8. September 2004)

Um die Frage zu beantworten:

```
$tag = "01";    // Geburtstag
$monat = "05";  // Geburtsmonat
$jahr = "1975"; // Geburtsjahr

// Ermitteln der seit 1970 vergangenen Sekunden bis zum Geburtstag
$time = mktime(0,0,0,date("m"),date("d"),date("Y"));

// Ermitteln der bis heute vergangenen Sekunden bis zum jetzigen Zeitpunkt
// (wobei man das mit time() auch einfacher machen könnte)
$birthday = mktime(0,0,0,$monat,$tag,$jahr);

// $time - $birthday ermittelt die Sekunden, die vom Geburtstag bis heute vergangen sind
// Dieser Wert wird anschließend durch die Anzahl der Sekunden eines Jahres Dividiert
// und man erhält das Alter in Jahren
$alter   = intval(($time - $birthday) / (3600 * 24 * 365));

// Ausgabe
echo "$alter";
```

snuu


----------



## saila (8. September 2004)

> _Original geschrieben von Gumbo _
> *In deinem Beispiel werden die Menschen alle am Neujahrstag ein Jahr älter, saila. *



Korrekt, deshalb schrieb ich auch dazu, das man dann eben mit mktime arbeiten muss. Auf der einen Seite geht es darum keine vollständigen Scripte hier zu posten, damit Fragende selbst was tun sollen und andererseits wird es dann doch getan.

Da bleibe ich wenn dann schon bei der Version, das ich einen Lösungsvorschlag geben, aber ihn in so offen lasse, das jeder noch was dran rumbasteln kann.

Leider muss ich mich auch nochmal darauf hinweisen Gumbo - *wer lesen kann ist klar im Vorteil*


----------



## Gumbo (8. September 2004)

Willst du mir damit die Nichtfähigkeit des Lesens unterstellen? Mit meinem letzten Beitrag wollte ich den Autor dieses Themas, jc-freak, und dich nur auf diese Tatsache hinweisen.

Mag sein, dass du meinen Beitrag falsch aufegefasst hast, doch in meinen Augen entspricht dein Beispiel etwa: „Das Alter lässt sich ermitteln, indem man das Geburtstdatum vom heutigen Datum subtrahiert.“
Für jemanden, für den die Umsetzung solch einer Thematik „Neuland“ ist, bringt eine solche Aussage nichts. Da zeihe ich doch lieber fertige Beispiele vor, auch wenn sie die Didaktik nicht besonders fördern.


----------



## Ben Ben (9. September 2004)

Ich finde egal ob Anfänger oder nicht Lösungen die das Ergebnis aus der DB kommen wesentlich eleganter und meine diese seien auch performanter.
Für Laien mag das vielleicht hart seien, aber dann sieht man wenigstens auch mal wie es funtkioniert oder wie man es machen kann. Sonst fängt man mit x anderen Funtkionen im Script wieder an irgendwa sauszubessern. 
Allein das Beipiels mein Datum kommt falsch formatiert aus der DB wie formatiere ich um. Da ist DATE_FORMAT wesentlich kürzer, eleganter und performanter als irgendein gesplitte und mktime und kram und das wieder umzudrehen.


----------



## Gumbo (9. September 2004)

Der Meinung bin ich auch: Wieso PHP die ganze Arbeit mit umständlichen Funktionskonstrukten überlassen, wenn das Ganze auch bereits fertig formatiert von MySQL übernommen werden kann?


----------



## benax (3. Dezember 2004)

Meiner Meinung nach ist die folgende SQL-Abfrage die eleganteste Lösung um das Alter aus einem Datum zu errechnen:

```
select YEAR(CURRENT_DATE)-YEAR(date_of_birth) - IF(RIGHT(CURRENT_DATE,5) < RIGHT(date_of_birth,5),1,0) from tabelle where id=21
```

In einfaches deutsch übersetzt:
wähle aktuelles Jahr minus Geburtsjahr und wenn aktuelles Datum (Monat und Tag werden verglichen) kleiner ist als das Datum des Geurtstages, dann ziehe 1 vom Ergebnis ab, ansonsten 0.

Das Ergebnis ist das tagesgenaue Alter.

Falls das Feld in der abgefragten Tabelle leer ist erhält man das aktuelle Jahr als 4-stellige Zahl.

Das kann man jedoch in einer einfachen if-Abfrage eliminieren:

Angenommen man speichert das Abfrageergebnis in $age, dann sieht die if-Klausel so aus:

```
$today = getdate();
echo ($age!=$today['year']) ? $age : 'unknown';
```

getdate() holt das aktuelle Datum in das Array $today:
Wenn $age ungleich $today['year'] ist wird $age ausgegeben ansonsten 'unknown'.

Wie gesagt, finde ich diese Lösung elegant und ausserdem ist sie sehr kurz.

Gurss
Benax


----------



## raptor86 (7. September 2007)

um das problem mit leuten die vor 1970 geboren sind zu umgehen


```
function alter($u_date){	//u_date als 1900-12-31
	$u_date=explode("-",$u_date);
	$alter=date("Y")-$u_date[0];
	$heute=mktime(0,0,0,date('m'),date('d'),date('Y'));
	$diftoage=mktime(0,0,0,$u_date['1'],$u_date['2'],date('Y'));
	if($diftoage>$heute) $alter--;
    return $alter;
}
```


----------



## philodance (9. April 2017)

Obwohl das Thema schon alt ist... eine sehr elegante Lösung hab ich auf http://rexo.ch/knowledge/index.php/2078/wie-das-alter-jahren-für-gegebenes-geburtsdatum-berechnen gefunden.


----------

