You are not logged in.

  • Login

1

Tuesday, December 28th 2010, 2:30pm

Alter aus Date-Format ermitteln

Hallo zusammen,

ich stehe mal wieder vor einem Problem: Ich habe in der Datenbank verschiedene Geburtsdaten eingetragen und würde mir gern das aktuelle Alter ausgeben lassen. Diese sind nur im Format JJJJ-MM-TT eingespeichert (Wie halt so üblich).

Habe schon bei Google nach einer passenden Antwort gesucht, aber leider nichts gefunden was wirklich funktioniert?!

Danke für jede Hilfe :D

2

Tuesday, December 28th 2010, 3:10pm

PHP Quellcode

1
2
$datum = explode('-', '1980-09-5'); 
echo date('Y') - $datum[0] - intval(date('n') < $datum[1] || date('n') == $datum[1] && date('j') < $datum[2]);

Sollte die größtmögliche Präzision bieten und Schalttage berücksichtigen.

This post has been edited 2 times, last edit by "Florian" (Dec 28th 2010, 3:27pm) with the following reason: Logikfehler behoben


3

Tuesday, December 28th 2010, 6:21pm

Warum PHP bemühen wenn MYSQL diese Aufgaben besser erledigen kann ?


mfg

4

Wednesday, December 29th 2010, 9:39am

Danke Florian, so klappt es zwar mit manueller Eingabe, aber per Funktion bei mir noch nicht :(

Wo ist der Fehler?

PHP Quellcode

1
2
3
4
5
6
7
8
function aktuellesalter($geburtsdatum) {
$datum = explode('-', '$geburtsdatum'); 
return date('Y') - $datum[0] - intval(date('n') < $datum[1] || date('n') == $datum[1] && date('j') < $datum[2]);
}
 
[....]
 
echo '('.aktuellesalter($row[geburtsdatum]).')';

5

Wednesday, December 29th 2010, 10:27am

PHP Quellcode

1
2
3
4
5
$geburtsdatum = '1984-06-12';
$geburtsdatum = DateTime::createFromFormat('Y-m-d', $geburtsdatum);
$jetzt = new DateTime();
$alter = $jetzt->diff($geburtsdatum);
print $alter->format('%y Jahre, %m Monate und %d Tage alt');

6

Wednesday, December 29th 2010, 10:42am

Warum PHP bemühen wenn MYSQL diese Aufgaben besser erledigen kann ?

Und wie?
Wo ist der Fehler?

$geburtsdatum als zweiter Parameter für explode sollte nicht in einfache Anführungszeichen gesetzt werden. Dafür solltest du dies in der letzten Zeile mit dem Index machen.
Womöglich ist wasserfalls Lösung aber auch performanter oder für dich besser geeignet.

7

Wednesday, December 29th 2010, 10:59am

Hier gibt es eine schöne, deutsche Beschreibung: http://dev.mysql.com/doc/refman/5.1/de/d…lculations.html

SQL Code

1
2
3
4
5
SELECT		name,
		geburtstag,
		(YEAR(CURDATE()) - YEAR(geburtstag)) - (RIGHT(CURDATE(), 5) < RIGHT(geburtstag, 5)) AS tieralter
FROM		haustier
ORDER BY	name;


Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
+----------+------------+------------+-----------+
| name     | geburtstag | CURDATE()  | tieralter |
+----------+------------+------------+-----------+
| Bowser   | 1989-08-31 | 2003-08-19 |        13 |
| Buffy    | 1989-05-13 | 2003-08-19 |        14 |
| Chirpy   | 1998-09-11 | 2003-08-19 |         4 |
| Claws    | 1994-03-17 | 2003-08-19 |         9 |
| Fang     | 1990-08-27 | 2003-08-19 |        12 |
| Fluffy   | 1993-02-04 | 2003-08-19 |        10 |
| Puffball | 1999-03-30 | 2003-08-19 |         4 |
| Slim     | 1996-04-29 | 2003-08-19 |         7 |
| Whistler | 1997-12-09 | 2003-08-19 |         5 |
+----------+------------+------------+-----------+


Alternativ kannst du auch mit TIMEDIFF arbeiten.

8

Wednesday, December 29th 2010, 11:02am

PHP ist nunmal eine Krücke vorallem wiederholtes aufrufen von Funktionen ist unperformant gegenüber einen SQL Statement

http://www.phpbuddy.eu/datum-zeit-funkti…ql.html?start=4

Das sollte genau euer Problem sein

Edit: mist dotnot schneller najo dafür habt ihr nen schöneren Link :P

9

Wednesday, December 29th 2010, 11:38am

$geburtsdatum als zweiter Parameter für explode sollte nicht in einfache Anführungszeichen gesetzt werden. Dafür solltest du dies in der letzten Zeile mit dem Index machen.
Womöglich ist wasserfalls Lösung aber auch performanter oder für dich besser geeignet.

Dankeschön, dass hat schon mein Problem gelößt und mein Kollege ist jetzt wieder 40 und nicht 2010 ;)

Werde mir die anderen Links gleich aber, rein Verständnishalber, auch noch durchlesen, danke! :)

10

Wednesday, December 29th 2010, 11:44am

Danke für die Links. Mit der dort gezeigten Abfrage könnte man natürlich auch meinen PHP-Code verkürzen:

PHP Quellcode

1
2
$datum = explode('-', '1980-09-05', 2);
echo date('Y') - $datum[0] - intval(date('n-j') < $datum[1]);

Wobei MySQL da wahrscheinlich weiterhin schneller ist, oder?

11

Wednesday, December 29th 2010, 12:30pm

Natürlich ist Mysql schneller

Bei einer Zeitumwandlung kann man natürlich kaum etwas erkennen, wenn aber nun sagen wir 100 user gelistet werden wird das schon deutlicher..
100 mal die Funktion , 100 mal explode, 100 mal date etc aufrufen

C ist nunmal schneller als PHP

Zudem ist die Mysqllösung elleganter


mfg

12

Wednesday, December 29th 2010, 3:30pm

Eigentlich habe ich eher eine fallbezogene, konkrete Begründung erwartet. Wo kann MySQL hier im Vergleich zu PHP nennenswert Zeit einsparen?

13

Wednesday, December 29th 2010, 4:10pm

Also ein Zugriff von PHP auf MySQL ist NICHT schneller als eine simple Rechenoperation innerhalb von PHP.
Auch würde ich NICHT sagen, dass eine MySQL Rechenoperation schneller ist als eine PHP Rechenoperationen.
Beide müssen erst über einen Interpreter in C Code übersetzt werden.

ABER was Zeit kostet ist Traffic.
Wenn die Daten sowieso aus MySQL geladen werden, dann ist es schneller, wenn du die Rechenoperation gleich in MySQL erledigst.
Dann muss nicht der kompletten Datumsstempel über den Socket übertragen musst, sondern nur das Endresultat als Zahl.

Im konkreten Beispiel macht das kaum einen Unterschied. Konkretere Beispiele sind Summen und Mittelwerte.
Hier wäre es langsamer wenn man n Zeilen zur Auswertung an PHP überträgt, anstatt das ganze auf MySQL Seite zu machen.

14

Wednesday, December 29th 2010, 4:53pm

1. Wenn es Mysqlfunktionen gibt sollten diese benutzt werden, sie sind schneller und einfacher zu verwalten
(mit QueryCache noch deutlicher)
2. Weder Mysql noch PHP generiert C Code


Konkrete Beispiele? (nicht näher angeschaut)
http://www.onextrapixel.com/2010/06/23/m…ql-performance/

15

Wednesday, December 29th 2010, 5:31pm

Ich glaube jeder weiß was gemeint ist. MySQL ist schneller als PHP. Aber reines PHP ist schneller als MySQL in PHP.

Einfacher Benchmark der beweist, dass die Antwortzeit von MySQL gegenüber reinen PHP Funktionen nicht schneller ist.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
$time = microtime(true);
for($i=0; $i<10000; $i++) {
	$res = mysql_query('SELECT NOW() AS x');
	mysql_fetch_array($res);
}
echo microtime(true) - $time;
 
$time = microtime(true);
for($i=0; $i<10000; $i++) {
	date('Y-m-d H:i:s');
}
echo microtime(true) - $time;


Resultat: 0.78295302391052 VS 0.062944889068604

16

Wednesday, December 29th 2010, 5:35pm

Öhm was ist den das für ein schwachsinniger Code, von sowas redet doch kein Mensch, zumindest nicht ich

17

Wednesday, December 29th 2010, 5:42pm

Konkret geht es hier um Date Funktionen. Und du hast in diesem Thema behauptet MySQL sei pauschal schneller.
Ich weiß dass du es im globalen Kontext gemeint hast, daher lass uns diese Diskussion an dieser Stelle beenden ;)

Similar threads

Social bookmarks