2010-10-25 2 views
5

Hier ist mein Code so weit:Wie wählt man UNIX Datum = "2010" in MySQL Abfrage?

SELECT `date`, title, category, url 
FROM cute_news 
WHERE category = '4' 
ORDER BY `date` DESC 

ich Seiten auf dem Jahr machen will, wie 2010, 2009, 2008 und so weiter. Die Datenbank speichert das Datum als UNIX_Timestamp. Sie sind nicht sicher, wie Sie ein Recordset mit einem Year-Parameter abfragen können?

WHERE unix_timestamp(YEAR) = '2010' or something??? 

Vielen Dank im Voraus. Ich bin verwirrt.

Antwort

4

Sie wollen etwas wie WHERE YEAR(FROM_UNIXTIME(date_field)) = 2010.

+0

Perfekt :-) Ich wusste, dass mir etwas einfach gefehlt ha. – eberswine

+0

@eberswine: Denken Sie daran, dass eine solche Abfrage langsam ist, wenn Sie viele Zeilen in Ihrer Tabelle haben. Die Datenbank müsste einen vollständigen Tabellenscan durchführen, um die gewünschten Zeilen zu filtern ... Wenn Sie andererseits einen Index für die Spalte "Datum" erstellen (vorausgesetzt, es existiert noch keine), können Sie den Befehl verwenden 'UNIX_TIMESTAMP()' Funktion wie im zweiten Beispiel in meiner Antwort. Die Datenbank wäre dann in der Lage, den Index zu verwenden, um schnell die gewünschten Zeilen zu finden, ohne einen vollständigen Tabellenscan durchzuführen. –

+0

@Daniel, das ist wahr, wenn das Datumsfeld der beste Diskriminator ist. Oft ist es natürlich auch möglich, MySQL die Option über Ihre Empfehlung zu geben, selbst wenn es nicht benötigt wird. – Matthew

0

Versuchen:

WHERE YEAR(FROM_UNIXTIME(`date`)) = 2010; 
3

Sie die FROM_UNIXTIME() Funktion verwenden können, aber darüber im Klaren sein, dass dies nicht einen Index für die date Spalte verwenden, falls vorhanden:

... WHERE YEAR(FROM_UNIXTIME(`date`)) = 2010 

Für Ihre Anfrage an be sargable, könnten Sie stattdessen die UNIX_TIMESTAMP() Funktion verwenden:

... WHERE `date` >= UNIX_TIMESTAMP('2010-01-01 00:00:00') AND 
      `date` < UNIX_TIMESTAMP('2011-01-01 00:00:00') 
+0

+1 passendere Antwort für größere Tabellen ... –