SEO-Software von Suchmaschinenoptimierung.de

Datenbankabfrage altersgruppe?

(hier klicken, um zum Original Thread zu gelangen)
Gamer20
hallöchen!

ich möchte meine bestimmte altergruppe aus der db ausgeben lassen, zum beispiel alle leute zwischen 21 jahren und 29 jahren!

jetzt habe ich das geburtsdatum in der datenbank normal drin stehen (05.11.195cool

das fomat der spalte Geburtsdatum, hab ich auf char gesetzt. ich nehme mal an das das schonmal nicht korrekt ist.

DATE wäre besser oder? nur da gibts viele möglichkeiten, beim eintragen in die datenbank (unter der eigentschaft "funktion") und da weiß ich net mit ewlcher eigenschaft ich es anlegen soll.

2. problem ist, wie ich das per SQL befehl dann auslesen lasse (select .....)

ich habe 2 variable

$avon=21
$abis=29

wie müßte nun die SQL zeile aussehen? ich habe keine ahnung.
derletztekick
Hi,

eine der Datumsfunktion, die SQL bereits mitbringt erscheinen wirklich besser. Die Abrage selbst ist dann recht simple. Das Alter ist ja eine Zeitspanne zwischen der Geburt und dem aktuellen Datum. Du musst also lediglich die Differenz zum aktuellen Datum bilden zB mit dem Timestamp:

Pseudocode:

code:
1:
2:
SELECT * FROM tabelle WHERE (geburtsDatum-aktuellemDatum) > 21 AND  (geburtsDatum-aktuellemDatum) < 29 


Micha
Gamer20
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
$ausgabe = mysql_query("SELECT * FROM nutzer WHERE GEB <= CURDATE() - INTERVAL 20 YEAR AND GEB >= CURDATE() - INTERVAL 60 YEAR");
while($i = mysql_fetch_array($ausgabe))
{
$Nick=$i['Nick'];
$GEB=$i['GEB'];
echo"
$Nick - $GEB
<br>";
}


so jetzt soll er mir aber gleichzeitig auch noch das alter mit ausgeben, damit ich es nicht noch extra per php ausrechnen lassen muß!

wie müßt ich das da ändern?
derletztekick
Hi,

geht

[code] (GEB - CURDATE()) AS alter{/code]

nicht?

Micha
Gamer20
code:
1:
2:
3:
4:
5:

$ausgabe = mysql_query("SELECT * FROM nutzer WHERE (GEB <= CURDATE() - INTERVAL 20 YEAR AND GEB >= CURDATE() - INTERVAL 60 YEAR) AS alter ORDER BY ID");



ne will er net, hat ich schon versucht!

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\...test.php on line 11
derletztekick
Hi,

Du willst es doch abfragen, also muss es nach select (an Stelle des *) hin?!

Micha
Gamer20
hmm abfragen? naja eher ausrechnen, anhand des datums in der tabelle (z.b. 1990-11-20)

ich hat mal ne formel wo mir das ergebnis per AS angezeigt wurde, aber da klappte die berechung mit intervall net.

diesesmal is es umgedreht *g*!

irgendwie muß das zusammen passen.
denn per php is das bissle aufwenig zu rechnen und wäre jedesmal ne 1/4 seite quellcode.

warum per php wenn ich es per sql mit einem zusatz haben kann, nur erstmal drauf kommen, das wird schwer.
derletztekick
Hi,

keine Ahnung, wo Dein Problem nun liegt. Wenn ich einen Wert aus der DB abfragen will, dann mache ich das nach dem Aufruf von SELECT und nicht bei der Auswahl der Daten (also nach WHERE, wie Du es derzeit willst).

Zitat:
denn per php is das bissle aufwenig zu rechnen

Man muß zwei Zahlen von einander abziehen; der Aufwand für a-b erscheint mir bei beiden gleichwertig.

Zitat:
jedesmal ne 1/4 seite quellcode

Für wiederkehrenden Code gibts Funktionen.

Gruß Micha
TrioxX
1. Geburtsdatum würde ich nicht als Klartext in die Db speichern, sondern als Timestamp, weil es sich so besser arbeiten lässt. Falls dies aus irgendwelchen Gründen aber so bleiben soll (z.b. weil Timestamp nur bis 1970 reicht), solltest du SQL das Datumsformat genau übermitteln, denn so wie du es speicherst, ist es für MySQL nicht kompatibel, um damit eine Rechnung anzufangen...

Grund dafür ist, dass die MySQL Funktion "DATE" ein Datum im Format YYYY-MM-DD abspeichert und nicht im Format DD.MM.YYYY

Um genau zu sein: Nicht 05.11.1950 sondern 1950-11-05

Das solltest du auch so ändern. Feldtyp ist in diesem Falle "date" und nicht "Varchar" (was man für Zahlenfelder nie verwenden sollte).

Eine Abfrage sähe dann z.B. so aus:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?
// MySQL Connect usw...

$avon '20';
$abis '100';

$qadd '(YEAR(CURRENT_DATE) - YEAR(GEB)) - (RIGHT(CURRENT_DATE,5) < RIGHT(GEB,5))';
$query mysql_query("SELECT * FROM nutzer WHERE ".$qadd." >= '".$avon."' AND ".$qadd." <= '".$abis."'");

while ($result mysql_fetch_array($query)) {
echo $result['Nick']." - ".$result['GEB']."<br />";
}
?>


Das Ganze ist recht kompakt gehalten:

$avon - Alter von...
$abis - Alter bis...
$qadd - Eine wiederholende rechenklausel zum Errechnen des Alters mit Hilfe des Geburtsdatums
$query - Unser MySQL Query

Der Rest sollte selbsterklärend sein...

Jetzt hab ich gelesen, dass dir das zu anstrengend ist, immer den selben Code zu verwenden. Wie Micha bereits schrieb, kann man hierzu eine entsprechende Funktion bauen, um den Ablauf kompakt zu halten. Um meinen obigen Code in eine Funktion zu packen, müsstest du etwa so vorgehen:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
<?
// MySQL Connect usw...

function ShowBetween($von,$bis)
{
    $qadd '(YEAR(CURRENT_DATE) - YEAR(GEB)) - (RIGHT(CURRENT_DATE,5) < RIGHT(GEB,5))';
    $query mysql_query("SELECT * FROM nutzer WHERE ".$qadd." >= '".$von."' AND ".$qadd." <= '".$bis."'");
    
    while ($result mysql_fetch_array($query)) {
     $data[] = array('Nick' => $result['Nick'], 'GEB' => $result['GEB']);
    }
    
    return $data;
}
?>


Das ist die Funktion. Diese kannst du dann dementsprechend auch öfter benutzen. Dazu verwendest du dann etwa diesen Code:

php:
1:
2:
3:
4:
5:
6:
<?
$avon '20';
$abis '100';

$daten ShowBetween($avon,$abis);
?>


Damit hast du nun die Ausgabe in die Variable $daten gepackt. Um diese auszugeben, solltest du dann entsprechend eine Schleife verwenden:

php:
1:
2:
3:
4:
5:
6:
<?
foreach ($daten as $key => $value);
{
    echo $value['Nick']." - ".$value['GEB'];
}
?>



Ich hab das Ganze jetzt nicht getestet, weil es mir dafür momentan noch zu früh ist. Aber du kannst es gern testen und uns mitteilen, ob das so funktioniert, oder nicht.

Da fällt mir übrigens ein: Falls du die Daten nicht umwandeln kannst, hast du die Möglichkeit, diese auch mittels DATE_FORMAT(GEB, '%d.%m.%Y') aus der DB zu holen. Dann muss aber der komplette $qadd geändert werden.

So long,
Sascha
Gamer20
hmm ja ich hate das geb feld in der db schon auf date gesetzt.

wenn ich einen neuen datensatz einfüge (per myadmin), kann ich ja bei dem feld GEB unter funktionen unter vielen einträgen wählen.

welcher wäre der korrekte eintrag in der combobox für unser deutshes format?

2. frage!

wenn ich einen neuen wert per php eintrage (neuer nutzer meldet sich an), muß ich den zusatz (funktion -> format der zelle) beim speichern mit angeben, wenn ja wie?

http://web86.sr37.firestorm.ch/DB.JPG

code:
1:
2:
3:
4:
5:
6:
7:
8:
$sql = "INSERT INTO testdb
(.....)
VALUES
(.....)";

$eintragen = mysql_query($sql) or die (MySQL_Error());



ok also so klappts erstmal:

code:
1:
2:
3:
4:
$BALT = '(YEAR(CURRENT_DATE) - YEAR(GEB)) - (RIGHT(CURRENT_DATE,5) < RIGHT(GEB,5))';
$ausgabe = mysql_query("SELECT *   FROM nutzer WHERE $BALT >= $avon AND $BALT <= $abis  ORDER BY GEB");


jetzt müßt ich noch den ql zusatz einbauen mit "as dasalter", aber so wie unten klappts net und den zusatz nach dem * anfügen geht auch net, da meckert sql!

code:
1:
2:
3:
4:
$BALT = '(YEAR(CURRENT_DATE) - YEAR(GEB)) - (RIGHT(CURRENT_DATE,5) < RIGHT(GEB,5))';
$ausgabe = mysql_query("SELECT *   FROM nutzer WHERE $BALT >= $avon AND $BALT <= $abis  AS 'dasalter' ORDER BY GEB");
derletztekick
Hi,

code:
1:
SELECT (`GEB` - CURRENT_DATE) AS deltaT


Micha
Gamer20
hmm ok, das hilft schonmal, jetzt wird foglendes ausgegeben:

Oniram -510098
Administrator -280291

gibt einen befehl der mir nur das jahr (ersten beiden stellen) angibt oder müßt ich das per php machen?

wie schaut es aus, mit dem datumsformat aus?

so das ich auch die dt. variante in der zelle angeben kann (19.05.199cool und auch damit rechnen kann?

im moment hab ich ja die engl. varainte.

das problem dürfte zie zusätzliche formatierung der zelle (DATE -> GEB) sein, da ich net weiß welche definition ich wählen müßte (siehe bild im letzten beitrag von mir)!

falls ich das per php regeln muß bzw. umwandeln muß, welchen befehl bräucht ich denn? gibt ja viele datumsbefehle in php.

oder muß ich das per explode machen in 3 variable (1 array) und dann neu zusammen basteln mit PUNKT getrennt?
derletztekick
Hi,

shit, Du solltest mal die beiden Werte drehen, damit Du gleich positive Werte bekommst (oder abs nutzen).

code:
1:
SELECT (CURRENT_DATE-`GEB`) AS deltaT


Jetzt hast Du afaik Sekunden (Deine Zahlen erscheinen etwas klein). Rechne mal lieber mit dem TIMESTAP:

code:
1:
SELECT (UNIX_TIMESTAMP(CURRENT_DATE)-UNIX_TIMESTAMP(`GEB`)) AS deltaT


Wie man diese in Minuten -> Stunden -> Tage ... -> Jahre umrechnet, bekommst Du sicher allein hin. Das kannst Du auch direkt im SELECT machen.

Micha
Gamer20
ja jetzt kommts ehe hin, is net mehr negativ.

Oniram - 510098
Administrator - 280291

so stimmts relativ, einmal 51 jahre und einmal28 jahre, den rest muß ich wohl per php abtrennen????
derletztekick
Hi,

oh, das ist schon das Jahr - sry ;-)

Ich würde es in SQL direkt machen (habe jedoch noch nie mit CAST was gemacht!)

code:
1:
SELECT   CAST(  (CURRENT_DATE-`GEB`)/10000 AS INT) AS ALTER


Micha

P.S. ansonsten gingen auch die Rundungsfunktionen FLOOR, würde ich denken
Gamer20
hmm ne da spuckt er:
Parse error: parse error in D:\....test.php on line 10

aus

eher mit floor, das hat ich schonmal gesehen, CAST sagt mir gar nix!
TrioxX
Also ich hab meine Lösung mal getestet und sie funktioniert problemlos.

Du musst also nurnoch das Datum richtig einfügen.

Ich persönliche empfehle ja, dass du das beim Eintrag in drei Felder teilst, wie es normalerweise auch ist:

Tag (Dropdown)
Monat (Dropdown)
Jahr (Text)

Danach musst du nurnoch die Eingabe in eine Variable packen und somit direkt vorformatieren:

code:
1:
$datum = $jahr."-".$monat."-".$tag;


Wenn die User das Geburtsdatum selber eintragen, solltest du die Eingabe auf eine korrekte Schreibweise prüfen und das eingegebene Datum dann entsprechend wie auch oben, für SQL vorformatieren:

code:
1:
2:
$datum = explode('.', $geburtsdatum);
$datum = $datum[2]."-".$datum[1]."-".$datum[0];
Gamer20
ja per php hab ich das vorformatiert bzw. zusammen gebastelt, dachte man kann es in die DB im dt. format schreiben.

aber auch net so wild, geb ja sehr selten das GEB datum aus, eher nur das alter.

SQL mäßig hab ich das jetzt so gelöst, so das nur die ersten beiden stellen ausgegeben werden:

code:
1:
2:
3:
... LEFT((CURRENT_DATE - `GEB`),2) AS deltaT ...


also danke leute das wahr net grad einfach *g*, aber jetzt haben wir es (ich setz mich zu selten mit sql auseinander, eher nur php ,darum wars so schwierig)!
(hier klicken, um zum Original Thread zu gelangen)



Tipp: Ranking-Konzept.de - Das SEO-Forum (Forum rund um die Suchmaschinenoptimierung) der artaxo AG.
Das große Versicherungs ABC von Versicherung.de - mit allen Aspekten der Computerversicherungen!
Fan-Foren.de, die große Community mit Musikforum ist ab sofort online.