Problem bei Datumsvergleich

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem bei Datumsvergleich

    Hallo,

    ich möchte ein Feld "date" aus einer MySQL-Datenbank (Typ: TIMESTAMP) mit der aktuellen Uhrzeit vergleichen

    PHP-Code:
      if ($row->date mktime())
         {
            echo 
    "Zeitpunkt in Datenbank liegt in der Vergangenheit";
         }
         else     
         {
            echo 
    "Zeitpunkt in Datenbank liegt in der Zukunft;
         } 
    Leider funktioniert es nicht, so wie ich es mache. Ich habe mir zum Test die Daten ausgeben lassen und bekomme für heute

    12:55 Uhr den TIMESTAMP 1188823442 ausgegeben (date-Feld)
    und für
    12:44 Uhr den TIMESTAMP 1181641442 (aktuelle Uhrzeit)

    Als Ausgabe hab ich dann "Zeitpunkt liegt in der Vergangenheit" bekommen, was ja nicht stimmt.

    Kann mir jemand sagen, was ich falsch mache?

    Danke, Andi

  • #2
    Der Mysql-Timestamp ist anders aufgebaut als der normale Unix-Timestamp. Du kannst ihn beim Auslesen umwandeln.
    PHP-Code:
    SELECT UNIX_TIMESTAMP(datum) AS datum ... 
    ich glaube

    Kommentar


    • #3
      Und die Zeitstempel in der DB sind mit Sicherheit UNIX_TIMESTAMP und keine MySql Date Fields ?
      Wenn ja: Warum lässt du dann nicht die DB die Auswahl machen
      PHP-Code:
      //Zukunft
      $sql "SELECT * FROM table WHERE date > UNIX_TIMESTAMP(now())";
      //Vergangenheit
      $sql "SELECT * FROM table WHERE date < UNIX_TIMESTAMP(now())"
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        @jahlives:

        In meinem Programm sollen nur Datensätze geändert werden dürfen, deren Datumswert im date-Feld noch in der Zukunft liegt. Deshalb zeige ich über meine SQL-Abfrage (genauso wie Du es vorgeschlagen hast) nur die Datensätze an, die bearbeitet werden dürfen. Um aber zu vermeiden, dass jemand die zu bearbeitenden Datensätze anzeigen lässt, dann etwas wartet (bis der Datensatz in der Vergangenheit liegt) und dann erst auf OK klickt, möchte ich per PHP nochmal eine zusätzliche Überprüfung durchführen, bevor ich die Daten in die DB schreibe.

        Kommentar


        • #5
          ...dann etwas wartet (bis der Datensatz in der Vergangenheit liegt) und dann erst auf OK klickt, möchte ich per PHP nochmal eine zusätzliche Überprüfung durchführen, bevor ich die Daten in die DB schreibe.
          Dann müsstest du beim Klick auf Okay noch irgendeine MySql Referenz für den Datensatz übertragen (z.B. die MySql ID). Vor dem Eintragen rufst du das date für diesen Datensatz mittels einer Query ab
          PHP-Code:
          $sql "SELECT date FROM table WHERE date > UNIX_TIMESTAMP(now()) and id=".mysql_real_escape_string($_POST['id']); 
          Wenn du kein Resultat kriegst auf diese Anfrage, dann weisst du, dass das Datum nun in der Vergangenheit liegt
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            Original geschrieben von jahlives
            Vor dem Eintragen rufst du das date für diesen Datensatz mittels einer Query ab
            Warum nicht einfach gleich das UPDATE machen - und da neben der ID des Datensatzes als Auswahledingung auch noch unterbringen, dass dessen Datum größer als NOW() sein muss?
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Warum nicht einfach gleich das UPDATE machen...
              Best Practice
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Gleich das UPDATE zu machen funktioniert leider nicht. Ich möchte ja dem Benutzer ausgewählte Datensätze zur Sichtung und zum Bearbeiten zur Verfügung stellen (eben nur die, die "noch in der Zeit" sind) und sie dann nach der Änderung Speichern.

                Deshalb hab ich es jetzt mit

                PHP-Code:
                SELECT DISTINCT UNIX_TIMESTAMPspieldatum ) AS spieldatumSpiele.spielID, ...

                FROM ... 

                WHERE spieldatum UNIX_TIMESTAMPnow( ) ) 
                versucht, bekomme aber um 16:20h Serverzeit folgende Datensätze ausgegeben:

                2007-06-12 18:22:57
                2007-06-12 13:55:45
                2007-06-11 14:21:35

                Irgendwas kann da nicht stimmen..! Hab den Code jetzt ohne PHP direkt in meine DB eingegeben.

                Was mir komisch vorkam: Ich habe als MySQL-Feld TIMESTAMP verwendet. Wenn ich jetzt eine Zeit testweise ändern möchte, lässt mich mein phpMyAdmin das zunächst nicht. Erst wenn ich die Funktion "NOW" (als Zusatzeinstellung für mein Datenbankfeld) entferne, kann ich meine Uhrzeit ändern. Sie wird mir dann auch richtig angezeigt, also denke ich, dass das wohl nichts zu bedeuten hat, aber ich fand es nur komisch, dass dieses "NOW" als Funktion immer wieder erscheint, auch wenn ich es nie ausgewählt habe.
                Zuletzt geändert von andi234; 12.06.2007, 15:24.

                Kommentar


                • #9
                  Gleich das UPDATE zu machen funktioniert leider nicht
                  Dann haste was falsch gemacht Das Update kommt natürlich erst zum Zuge, wenn der User seine Änderungen an dein Script schickt
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Original geschrieben von andi234
                    Gleich das UPDATE zu machen funktioniert leider nicht.
                    Du hast nicht verstanden, wie's gemeint war.

                    Dass du zunächst mal einen SELECT brauchst, um die Daten darzustellen, ist natürlich klar.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Achso, dann hab ich euch falsch verstanden, sorry. Dann würde das mit dem Update natürlich gehen. Trotzdem besteht mein Problem von oben weiterhin. Ich möchte ja die zu ändernden Daten erstmal anzeigen lassen und da stoß ich dann auf das oben beschriebene Problem, dass sowohl Datensätze VOR und NACH der aktuellen Zeit angezeigt werden.

                      Beim Schreiben in die DB kann ich ja dann tatsächlich beim UPDATE-Statement eine Datums-Einschränkung vornehmen, da hast Du recht.

                      Kommentar


                      • #12
                        Wenn es denn eine Mysql-Timestampspalte ist, dann ist das mit dem UNIX_TIMESTAMP beim Auslesen richtig, beim Vergleichen mit NOW() überflüssig / verkehrt - so schlau ist MySQL schon, dass es die eigenen Formate mit NOW() vergleichen kann. Also

                        WHERE spieldatum > NOW().

                        Das was du sonst meinst, ist wohl "on update current timestamp" - diese Spalte bekommt ja bei jeder Änderung automatisch den Timestamp der letzten Änderung, sofern nichts anderes angegeben wurde. Das passiert normalerweise mit der ersten Timestamp-Spalte.

                        Quick and Dirty: Eine Timestampspalte "lastchanged" oder so vor deiner einfügen, die bekommt dann das "on update current timestamp".
                        ich glaube

                        Kommentar


                        • #13
                          Original geschrieben von andi234
                          Ich habe als MySQL-Feld TIMESTAMP verwendet.
                          Und du hast, trotz Hinweis darauf, noch nicht verstanden, dass das etwas vollkommen anderes als ein Unix Timestamp darstellt.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Original geschrieben von wahsaga
                            Und du hast, trotz Hinweis darauf, noch nicht verstanden, dass das etwas vollkommen anderes als ein Unix Timestamp darstellt.
                            Aber eben deswegen wandle ich das Feld doch über

                            PHP-Code:
                            SELECT UNIX_TIMESTAMP(datum) AS datum ... 
                            in einen UNIX_TIMESTAMP um. Und da NOW() auch ein UNIX-TIMESTAMP ist, sollte das doch ein gültiger Vergleich sein, oder nicht?

                            Kommentar


                            • #15
                              *räusper*

                              Nein, NOW() ist eine SQL Funktion.
                              ich glaube

                              Kommentar

                              Lädt...
                              X