Newsbeiträge nach Zeitraum aus Datenbank auswählen

Hallo Board Gemeinde.

ich sitze grade an einem kleinen Newsscript für die neue Version meiner Website (werde bis morgen wohl nicht fertig sein :neutral_face: )
Dabei möchte ich, dass nur Beiträge der letzten 2 Monate angezeigt werden.
Das Datum des eintrags ist als timestamp in der Datenbank gespeichert.

hier mein bisheriger Code, der leider nicht funktioniert:

$maxNewsTime = time() - 62*24*60*60;
$sql = "SELECT * FROM `news` WHERE `date` > " . $maxNewsTime;
$query = mysql_query($sql);

Bitte hilft mir, wie immer thx im vorraus :wink:

jw-lighting

Das solltest du aendern.

Unix Timestamps in einer MySQL-Datenbank zu benutzen, ist i.a.R. suboptimal.
Nutze einen der Datumstypen, den MySQL dir bereitstellt - dann kannst du darauf auch komfortabel mit den Datumsfunktionen von MySQL arbeiten. Im konkreten Falle hilft dir dann bspw. DATE_SUB sehr leicht weiter.

Und das gewoehne dir bitte ganz ab - “funzt nich” ist absolut keine brauchbare Problembeschreibung.

anders gesagt, datentyp ist TIMESTAMP, im Format ‘YYYY-MM-DD HH:II:SS’

Sorry, aber es gibt kein andres Problem als das es nicht funktioniert.
Welcher andere Datentyp wäre denn besser (sollte automatisch bei INSERT und UPDATE gesetzt weden)?

für solche scripts sollte man lieber das, was man in php unter timestamp (time()) versteht nehmen, in Mysql hiesse das dann INT (15)…
dann kannst du ganz einfach beim SELECT befehl dieses hier hinzufügen: " WHERE timestamp_feld > ‘". $bestimmter_zeitraum ."’"
die variabel bestimmter_zeitraum musst du dann halt noch errechnen…

mfg Joey

Das Limit nur zur Sicherheit :wink:

Das Limit nur zur Sicherheit :wink:

OK, das passt.

Na ja, wenn du einen MySQL TIMESTAMP als Feldtyp verwendest, dann ist es ja auch unsinnig, diesen mit einem Unix Timestamp, wie PHPs time() ihn liefert, vergleichen zu wollen.
Mach dir bitte erst mal den Unterschied klar … und dann schau dir die Funktion an, die ich nannte.

Nein, das sollte man eben nicht.

Fuer zahlreiche Operationen, die man mit so einem Datum auf der Datenbank machen moechte (Selektion nach bestimmtem Zeitraum, Gruppierung ueber Monat/Jahr, etc.), ist das native Datumsformat der Datenbank besser geeignet.

Wenn man dann beim Anzeigen der Daten diese in PHP mittels strftime() o.ae. nach lokalenEinstellungen formatieren moechte - dann kann man sich beim Auslesen der Daten das ganze von MySQL immer noch als Unix Timestamp liefern lassen.

ich bin der Meinung, dass man eben trotzdem den INT nehmen sollte, ganz einfach, weil das mit PHP kombiniert viel einfacher wird…

mit ein wenig code bekommst du dann auch deine einträge des letzten Jahres:

$b = strtotime(date("Y") - 1."-01-01 00:00:00"); $e = strtotime(date("Y") - 1 ."12-31 23:59:59"); $mysql_query_code = "SELECT * FROM `table` WHERE `date` > '$b' AND `date` < '$e'";

ich sehs nicht ein, wozu das timestamp in der DB gut sein soll, sorry…

mfg Joey

Ganz einfach: Weil es einen Sinn hat, dass MySQL den Datentyp TIMESTAMP eingeführt hat :wink:

Nein, wird es nicht.

Die bekomme ich mit noch weniger Code:
SELECT * FROM tabelle WHERE YEAR(datum) = ‘2008’

Und wie machst du das mit deinem Unix Timestamp, wenn du beispielsweise die Eintraege nach Jahr und Monat gruppieren willst, um die Anzahl Eintraege je Monat zu ermitteln …?

Genau :smiley:

Ich habs jetzt mit deiner Version probiert, und es funktioniert prächtig. !haue

thx euch allen für die schnelle hilfe

:bp:

Das ist immer noch suboptimal, weil du das Vergleichsdatum erst in PHP „vorbereiten“ musst.

Die Datenbank kennt das aktuelle Datum, und kann davon auch zwei Monate abziehen - also keine Notwendigkeit, da mit PHP irgendeine Vorarbeit zu leisten.

könnte man auch mit SQL machen, wäre auch kein Problem :ps:

Jaja, ist ja schon gut. Ich bin nunmal besser in PHP als in SQL, von daher passt mir michis Variante schon besser.
Und was die efizienz angeht: die 1000 besucher täglich werden vorerst wohl auch ausbleiben :wink:

Es gibt wieder ein Problem mit dem Script:

Er holt einen Eintrag aus der Datenbank, welcher in der Zukunft liegt.

Code solte eigentlich das Gegenteil bewirken: :astonished:

$maxNewsTime = time() - 62*24*60*60; $minNewsTime = time(); $sql = "SELECT * FROM `news` WHERE `date` > '" . date("c",$maxNewsTime) . "' AND `date` <= '" . date("c",$minNewsTime) . "' ORDER BY `date` DESC LIMIT 30"; //echo $sql; $query = mysql_query($sql);

hier der Link:

jw-lighting.xe.cx/news.php

Dort ist ein Beitrag, von heute 20Uhr, obwohl es erst halb 6 ist… :unamused:

thx schonmal :wink:

Und wie sieht date(‘c’) aus?
Manual: ISO 8601 date (added in PHP 5) 2004-02-12T15:19:21+00:00

Das waere fuer gerade jetzt ‘2009-02-28T17:33:49+01:00’, und damit fuer dein $maxNewsTime ‘2008-12-28T17:33:49+01:00’

‘2009-02-28 20:00:00’ ist groesser als ‘2008-12-28T17:33:49+01:00’, und
’2009-02-28 20:00:00’ ist kleiner als ‘2009-02-28T17:33:49+01:00’

Works as designed.

Brrr, jetzt bin ich total durch’n Wind :ps:

Verstehe ich jetzt nicht? Warum sollte ‚2009-02-28 20:00:00‘ kleiner sein als ‚2009-02-28T17:33:49+01:00‘? Schliesslich liegt ersteres weiter in vom 1.1.70 entfernt, und müsste damit doch größer sein… :motz:

OK, frage ich anders^^ o.0 Was muss denn jetzt schreiben, um keine Beiträge aus der Zukunft zu holen, und keine, die älter als 2 Monate sind? :wink:

WHERE `datum` > DATE_SUB(NOW(), INTERVAL 2 MONTH) AND `datum` <= NOW()
datum muss größer als Heute minus 2 Monate sein
und kleiner (oder gleich) Heute.

dev.mysql.com/doc/refman/5.1/en/ … n_date-add

sowas in der Art?

Danke, so gehts auch, und ist wsl auch noch schneller.

Suppi, funzt!

Das sind keine Zahlen, sondern Strings. Und also solche werden sie auch verglichen.
Die ersten paar Stellen sind bei beiden gleich, dann kommen wir zu der Stelle, wo im ersten String ein Leerzeichen, und im zweiten ein ‘T’ steht. Das Leerzeichen liegt auf einer niedrigeren (ASCII-)Position als das T, und demzufolge wird der erste String als “kleiner” betrachtet.

Vor allem solltest du von Anfang an beruecksichtigen, was dir bereits ganz zu Beginn dieser Diskussion gesagt wurde:

OK luftholen

Ich war davon ausgegangen, das ie MySQL-Engine die Strings als Daten (was ist die Mehrzahl von Datum???) erkennt, und danach auch vergleicht.
So ist das logisch, aber wen man von obigem ausgeht, nicht so leicht verständlich.

bzgl. DATE_SUB:
Ich benutze es ja jetzt, nur bin ich noch kein SQL-Profi, und da ich von obigem ausgegeangen war, erschien das für mich dann einfacher, und daher für mich sinnvoller.