PHP MySQL Datumsabfrage sortieren

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

ich stecke mal wieder vor einem MySQL Problem.

Ich habe eine Tabelle mit mehreren Daten.
2011-12-01
2011-12-02
2011-12-03
2012-01-03
2012-01-04
2012-01-04
2012-02-04

nun stelle ich mich aber etwas blöd an, einträge nur aus januar 2012 abzufragen. hat da jemand den passenden ansatz für mich?
 
Suchst du sowas?

select * from datenbank where date = '2012-01-*';
Oder ähnlich...

Damit müsste er alles aus dem Januar finden können.
 
Ist eine Weile her, dass ich selbst MySQL verwendet habe, aber entweder nimmst du

WHERE YEAR(datum) = 2012 AND MONTH(datum) = 1

was aus der Applikationsschicht etwas einfacher zu parametrisieren wäre, oder

WHERE datum BETWEEN '2012-01-01' AND '2012-01-31'
Ergänzung ()

Suxxess schrieb:
Suchst du sowas?

select * from datenbank where date = '2012-01-*';
Oder ähnlich...

Damit müsste er alles aus dem Januar finden können.

Der korrekte Syntax dafür wäre

SELECT * FROM datenbank WHERE date LIKE '2012-01-%'

würde zwar gehen, ist aber nicht sehr performant, da die Datenbank hier keinen Index auf der Datumspalte verwenden könnte und die meisten Code-Reviewer würden über den unnötigen Typecast die Nase rümpfen :)
 
Die YEAR()-Variante ist genauso unperformant, einzig die BETWEEN-Variante kann einen Index nutzen.
 
Ich weiß nicht ob es bei MySQL genauso ist wie bei Postgresql, aber solange bei einer LIKE Abfrage der %-Platzhalter am Ende steht wird der Index genutzt. Also '%-01-01' kein Index, '2012-01-%' Index wird genutzt.
 
Daichi schrieb:
Ich weiß nicht ob es bei MySQL genauso ist wie bei Postgresql, aber solange bei einer LIKE Abfrage der %-Platzhalter am Ende steht wird der Index genutzt. Also '%-01-01' kein Index, '2012-01-%' Index wird genutzt.

Wenn der Datentyp der Spalte bereits ein CHAR oder VARCHAR Feld ist, ja. Das Problem ist aber, dass ein DATE-Feld intern numerisch gespeichert ist und der Index auch dementsprechend aufgebaut ist. Für die LIKE-Operation muss jeder einzelne Wert aber in die String-Repräsentation der Werte konvertiert werden, und dafür ist der Index dann nicht mehr benutzbar.

@ice-breaker: Korrekt. Ich hab' das Beispiel auch nur deswegen aufgeführt, weil es die einfachste Quick-and-Dirty Lösung ist, wenn man den SQL String programmatisch mit prepared Statements zusammenbauen muss. BETWEEN ist auf alle Fälle die beste Lösung
 
danke, die lösung mit BETWEEN passt genau!
vielen dank und euch schöne feiertage!
 
Zurück
Oben