Wayne: Alle Einträge löschen die einen Timestamp von gestern haben

Hallo,

ich habe eine Datenbank mit einer 2spaltigen Tabelle.

1. Spalte "ips" typ: VARCHAR
2. Spalte "timestamp" typ: TIMESTAMP

Ich möchte nun ein Skript schreiben mit dem alle Ips gelöscht werden die einen Timestamp von gestern haben.
D.h. also alle Ips die gestern eingetragen wurden sollen gelöscht werden!

Wie löse ich das am besten?

Lg

Der Wayne

  1. Hallo,

    wie wäre es damit: Du löschst (DELETE) alle Einträge von (FROM) der Tabelle, welche (WHERE) einen Timestamp-Wert kleiner als (<) den Beginn des aktuellen Tages (CURDATE()) haben.

    Den Rest schaffst du allein. :)

    Gut Nacht, Frank

    1. Hallo,

      Hi.

      wie wäre es damit: Du löschst (DELETE) alle Einträge von (FROM) der Tabelle, welche (WHERE) einen Timestamp-Wert kleiner als (<) den Beginn des aktuellen Tages (CURDATE()) haben.

      Hm also

      $sql="DELETE FROM tabellenname WHERE timestamp < CURDATE()"

      ???

      Lg

      1. echo $begrüßung;

        wie wäre es damit: Du löschst (DELETE) alle Einträge von (FROM) der Tabelle, welche (WHERE) einen Timestamp-Wert kleiner als (<) den Beginn des aktuellen Tages (CURDATE()) haben.
        $sql="DELETE FROM tabellenname WHERE timestamp < CURDATE()"

        Ja, wenn du alle löschen willst, die älter als heute sind. Dein OP klang aber so, als ob du nur die vom gestrigen Tag haben willst. Wenn du den gestrigen Tag genau beziffern kannst, wäre das

        DATE(timestamp) = '2007-12-22'

        Wenn nicht, müsstest du erst "gestern" ausrechnen. Wie das Datum von heute zu ermitteln ist, weißt du ja schon. Um davon einen Tag abzuziehen, kennt MySQL - ich nehme mal an, du suchst die Lösung für MySQL - Datums- und Zeit-Berechnungsfunktionen, beispielsweise DATE_SUB() (Beschreibung bei DATE_ADD()).

        echo "$verabschiedung $name";

        1. hi

          Ja, wenn du alle löschen willst, die älter als heute sind. Dein OP klang aber so, als ob du nur die vom gestrigen Tag haben willst.

          Nee ich will wirklich nur alle IPs mit dem Timestamp von gestern löschen.

          also ist das

          $sql="DELETE FROM tabellenname WHERE timestamp < CURDATE()"

          richtig ?!

          lg

          1. Hi,

            1. also bist du jetzt Wayne oder Phil Z.?

            2. Meintest du wirklich den 21.12.2007?

            Dann musst du den 21.12.2007 zu einem Datum umformen, das geht mit STR_TO_DATE(str,fmt)

              
            -- Beispiel  
            SELECT STR_TO_DATE('21.12.2007', '%d.%m.%Y');  
            
            

            Dann kannst du DATE(timestamp) aus deiner Tabelle mit STR_TO_DATE('21.12.2007', '%d.%m.%Y') vergleichen (=).

            1. Wenn du gezielt wirklich nur von dem jeweils gestrigen Tag löschen willst, dann befolge dedlfix's Rat: Berechne den Datumswert für gestern. Das geht am Beispiel deiner Tabelle mit
              
            SELECT  
                IP  
               ,timestamp  
               ,DATE_ADD(timestamp, INTERVAL -1 DAY) AS gestern  
               ,(timestamp - INTERVAL 1 DAY) AS auch_gestern  
              FROM tabellenname  
            
            

            Alles was du dann noch tun musst, ist die "Berechnung von gestern" in die WHERE Klausel zu basteln.

            1. Wenn du dies jeden Tag machst, kommt das aufs selbe raus, du hast ja dann maximal nur noch die Einträge von gestern drin.

            2. Warum testest du nicht einfach dein SQL an einer Kopie der Tabelle? Probieren geht über studieren.

            Ciao, Frank

            1. Hi,

              1. also bist du jetzt Wayne oder Phil Z.?

              Phil Z. alias Wayne :D

              Ich baue eine Seite auf auf der sich andere Leute registrieren können mir ihrer Page. Diese können auf ihrer Page einen Votebutton machen damit ihre Besucher für sie voten können. Das dürfen sie allerdings nur einmal am Tag.
              Also wird deren IP in der DB gespeichert und ein Cookie bei ihnen abgelegt!
              Jede Nacht um 24:00 Uhr ruft dann ein Cronjob das Skript auf, das alle IPs vom gestrigen Tag löscht.

              1. Wenn du gezielt wirklich nur von dem jeweils gestrigen Tag löschen willst, dann befolge dedlfix's Rat: Berechne den Datumswert für gestern. Das geht am Beispiel deiner Tabelle mit

              SELECT
                  IP
                 ,timestamp
                 ,DATE_ADD(timestamp, INTERVAL -1 DAY) AS gestern
                 ,(timestamp - INTERVAL 1 DAY) AS auch_gestern
                FROM tabellenname

              
              >   
              > Alles was du dann noch tun musst, ist die "Berechnung von gestern" in die WHERE Klausel zu basteln.  
              
              Und diese geht wie? =/ Irgendwie hab ich den Durchblick verloren .. auch wenn ich mich gerade wirklich dumm anstelle :D  
              Und wo ist das Delete?  
                
              Bye  
                
              Phil/Wayne
              
              1. echo $begrüßung;

                Und wo ist das Delete?

                Das DELETE kommt erst dann zum Einsatz, wenn du dir die passende WHERE-Klausel zurechtgebaut hast. Ob sie passt, kannst du am einfachsten und ohne Datenverlust testen, indem du sie in einem SELECT probierst, und schaust, ob sie dir dabei die richtigen Datensätze liefert.

                echo "$verabschiedung $name";

          2. Hello,

            Ja, wenn du alle löschen willst, die älter als heute sind. Dein OP klang aber so, als ob du nur die vom gestrigen Tag haben willst.

            Nee ich will wirklich nur alle IPs mit dem Timestamp von gestern löschen.

            also ist das

            $sql="DELETE FROM tabellenname WHERE timestamp < CURDATE()"

            richtig ?!

            Nein. Aber soweit solltest Du doch mitdenken können.

            timestamp < CURDATE()

            würde alle Sätze filtern, bei denen der Timestamp-Wert kleiner ist, als der Wert der Funktion curdate() http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_curdate

            DATE(timestamp) = date(date_sub(now(), interval 1 day))

            wäre eine plausibler Vergleich, um den gestrigen Tag zu filtern.

            DATE(timestamp)             finde das Datum zum Timestamp
                =
                date(                       finde das Datum
                 date_sub(                  ziehe vom aktuellen
                   now(), interval 1 day))  Timestamp einen Tag ab

            date_sub erkennt alleine, ob es sich bein ersten Argunment um einen timestamp oder ein Datum handelt.

            http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-add

            Harzliche Grüße vom Berg und Frohe Weihnachtszeit

            Tom

            --
            Nur selber lernen macht schlau