MySQL-Abfrage einschränken
RAINER
- php
0 Philipp Hasenfratz0 RAINER0 Bernd0 RAINER
0 Philipp Hasenfratz0 RAINER
Hallo,
mit
$abfrage = "SELECT * from $tab_termine ORDER by datum ASC";
lasse ich eine Tabelle ausgeben. Wie kann ich in diese Abfrage noch eine Einschränkung nach Monaten integrieren. Meine Datums-Spalte (datum) ist ein UNIX-Zeitstempel.
Ich dachte das geht so:
$abfrage = "SELECT * from $tab_termine WHERE date('m', 'datum') LIKE 'Juni' ORDER by datum ASC";
Leider funktioniert das aber nicht...
Wer kann mir helfe???
Danke, RAINER
Halihallo Rainer
$abfrage = "SELECT * from $tab_termine WHERE date('m', 'datum') LIKE 'Juni' ORDER by datum ASC";
Das wäre auch nicht sehr performant, besser wäre:
SELECT * FROM $tab_termine WHERE MONTH(datum) == 6 ORDER BY datum ASC
Viele Grüsse
Philipp
Hi Philipp,
leider läuft Deine Version auch nicht :-(((
SELECT * FROM $tab_termine WHERE MONTH(datum) == 6 ORDER BY datum ASC
Was nun???
Rainer
Was nun???
Rainer
Hallo Rainer,
wie wärs mit Dokumentation lesen?
Gruss
Bernd
Hi Bernd,
habe ich versucht - klappt aber alles nicht ....
Halihallo RAINER
leider läuft Deine Version auch nicht :-(((
Dann machst du was falsch (glaube ich zumindest). Was kommt denn für eine Fehlermeldung?
date ist übrigens als Spalten-/Tabellennamen in ANSI SQL nicht erlaubt (obwohl in mysql schon), solltest du, wenn du auch andere DB's verwende(est|n) (willst) ändern.
Viele Grüsse
Philipp
Hi Philipp,
ich glaube es liegt an meinem Datumsformat.
dies ist UNIX, also z.B. 1009839600.
Kann es sein, dass der MONTH(datum) - Befehl damit nicht klarkommt? Sondern nur mit Datum im Format 2002-02-02 ???
Wie kann ich das hinkriegen?
Danke nochmal, RAINER
Halihallo RAINER
ich glaube es liegt an meinem Datumsformat.
dies ist UNIX, also z.B. 1009839600.
Dessen bin ich mir nicht ganz sicher:
Ich glaube du musst die Daten in "normaler Form" speichern, also z. B. 2002-12-30, diese
wird dann intern in eine Timestamp umgewandelt und als 32-bit Integer in der DB
gespeichert. Ein Insert mit "date='1009839600'" kann evtl. zu falschen
Typenkonvertierungen führen. Siehe dazu mal deine Tabelle, was steht dort bei normalem
SELECT in der date Spalte?
Kann es sein, dass der MONTH(datum) - Befehl damit nicht klarkommt? Sondern nur mit Datum im Format 2002-02-02 ???
Nein. Timestamp-Columns sollten sich (in der Verarbeitung/Selektion) gleich wie alle anderen verhalten.
Viele Grüsse
Philipp
Hallo nochmal,
in der Spalte steht: 1009839600 - das wird dort eingefügt durch die time()-Funktion!
Das Problem ist, ich kann das nicht mehr ändern ... die Tabelle ist einfach zu umfangreich und es hängen auchnoch andere Sachen mit dran, die Funktionieren, z.B. diese Abfrage
$abfrage = "SELECT * from $tab_termine WHERE datum > UNIX_TIMESTAMP(curdate()) OR datum = UNIX_TIMESTAMP(curdate()) ORDER by datum LIMIT 0, 3";
Da werde mir dann immer die letzten drei aktuellen Termine ausgegeben.
Aber warum klappt das nicht wenn ich das auf Monate beschränken will ???
Warum klappt WHERE MONTH(datum) = 8 nicht????
Danke für Deine Geduld,
Rainer
Halihallo RAINER
in der Spalte steht: 1009839600 - das wird dort eingefügt durch die time()-Funktion!
OK. Das hat dann aber nur noch wenig mit dem mysql-Datentyp TIMESTAMP zu tun. Du
solltest den Typ dann bei Gelegenheit in unsigned INT umwandeln.
Aber warum klappt das nicht wenn ich das auf Monate beschränken will ???
Naja, wie ich auch der von dir geposteten Lösung entnehme, setzt mysql den Integer nicht
1:1 um, sondern versucht ihn als strinified-date zu interpretieren, das Ergebnis ist,
dass der Typ nicht umgewandelt werden kann und in gegebener Form übernommen wird; das
funktioniert zwar, nur mit dem Nachteil, dass man Date/Time-Funktionen nicht mehr
verwenden kann (naja, verwenden kann man sie, nur spucken sie irrelevante Daten aus).
Zu deiner Lösung: FROM_UNIXTIMESTAMP liest nun einen Integer ein (und der ist ja
fälschlicherweise auch gespeichert) und konvertiert ihn in ein mysql-date-Typ. Dieser
kann dann natürlich wieder von MONTH richtig umgesetzt werden.
Viele Grüsse
Philipp
Hi,
hab die Lösung !!!
WHERE MONTH(FROM_UNIXTIME(datum)) = 8
Danke nochmal,
Rainer