Einträge der letzten 7 Tage aus DB auslesen

  • Hallo,

    ich möchte gern einträge der letzten 7 Tage aus der DB lesen.
    In der Datenbank hab ich eine Spalte mit tstamp in dem das datum glaube ich als Timestamp gespeichert wird.

    Meine SQL abfrage hab ich jetzt schon mal so umgebaut:

    WHERE DATE_SUB(NOW(), INTERVAL 7 DAYS) < tstamp

    aber er gibt leider nichts aus. Muss ich die Werte von tstamp noch extra umwandeln ?

    Danke

  • Nachtrag:
    Das heißt nicht "INTERVAL 7 DAYS", sondern "INTERVAL 7 DAY"

    DATE_SUB erwartet einen Wert vom Typ "DATETIME oder DATE". Wenn es ein UNIX-Timestamp ist, dann musst Du den umwandeln mit FROM_UNIXTIME(), also als:
    WHERE DATE_SUB(NOW(), INTERVAL 7 DAY) < FROM_UNIXTIME(tstamp)

    Alternativ natürlich auch, wenn das alles innerhalb der letzten 7 Tage willst und in der DB ein Unixtime steht:

    Mit PHP den timestamp von "vor 7 Tagen" errechnen und die DB einfach abfragen mit:
    WHERE tstamp >= $php_timestamp

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Zitat von medium;14427

    also das in der Tabelle unter tstamp müsste ein UNIX-Timestamp sein z.B 1328783063


    Ok, hatte das oben editiert. Gugg mal da :) Mit einem Unix-Timestamp kann man so erst mal nicht rechen, der von Mysql ist anders. Also entsprechend umwandeln.

    MySQL-Datetime: YYYY-MM-DD HH:MM:SS
    MySQL-Date: YYYY-MM-DD
    MySQL-Timestamp: YYYYMMDDHHMMSS
    UNIX-Timestamp: Wert in Sekunden ab 1. Januar 1970

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • aber irgendwie geht das nicht so genau?

    hier meine SQL Abfrage

    SELECT * FROM fe_users WHERE DATE_SUB(NOW(), INTERVAL 7 DAY) < FROM_UNIXTIME(crdate)

    heute ist der 15. das heißt er müsste mir ja alle Datensätze vom 8.2 bis 15.2 anzeigen - macht er aber nicht.
    Lass ich dir WHERE abfrage weg, gibt er mit zwei Datensätze mit date('d.m.Y H:s', $row['crdate']) die am 10.02.2012 erstellt wurde, die müssten ja genau in dem Zeitraum sein.

  • Ok, neuer Ansatz:

    SELECT * FROM fe_users WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) < FROM_UNIXTIME(crdate)

    NOW() arbeitet auch mit Stunden, Minuten und Sekunden, CURDATE() nur mit dem Tag. Musst dann mal sehen ob das passt. Wahrscheinlich fehlen dann aber die Datensätze von heute, also dann wohl ein:
    SELECT * FROM fe_users WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= FROM_UNIXTIME(crdate)

    Ansonsten, führe einfach mal ein SELECT CURDATE(); aus und schau, dass das Datum auch stimmt. Sollte "2012-02-15" ergeben.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • So, bevor ich es vergesse, bin dann nämlich erst mal weg:

    Abfrage von heute bis zurück zum 1. des Monats. Besser gesagt also am 1. des Monats beginnen und bis heute :) INTERVAL ist ja dafür gedacht, was der Name schon sagt, einen festen Zeitraum. 1. bis "heute" ist aber variabel ;)

    SELECT * FROM fe_users WHERE FROM_UNIXTIME(crdate) >= DATE_FORMAT(CURDATE(), '%Y-%m-01')

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(