|
|
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.195
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.199 
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)!
|
|