Announcement

Collapse
No announcement yet.

Datumssortierung funktioniert nicht wirklich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datumssortierung funktioniert nicht wirklich

    Hallo,

    ich möchte aus einer Tabelle ein Ergebnis zurückgeben, welches zwischen 2 Datumsangaben liegt. Die Zeitwerte liegen als UNIX-Timestamp in der DB (es handelt sich um eine bestehende DB in der das Datumsformat so beibehalten werden soll/muss).

    Folgende Abfrage (mit PHP-Rechnung) funktioniert:


    $timeline = strtotime("-4 days");
    $timenow = strtotime("now");

    [highlight=sql]
    "SELECT COUNT(id) AS count FROM ".DB_PREFIX."archive WHERE senddate BETWEEN $timeline AND $timenow AND loginname = 'XXXXXX'";
    [/highlight]

    Folgende MySQL-Rechnung liefert aber ein falsches Ergebnis:

    "SELECT COUNT(id) AS count FROM ".DB_PREFIX."archive WHERE senddate BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND $timenow AND loginname = 'XXXXXX'";


    Das MySQL-Ergebnis ist deshalb falsch, weil es in der betreffenden Tabelle lediglich 2 Werte gibt. Einen von heute und einen von vor 4 Tagen.

    Das mittels PHP 'erzeugte' Ergebnis liefert den richtigen Wert '1' zurück, MySQL aber '2'.

    Woran liegt das und ist die Datumsformatierung mittels meine MySQL-Syntax so korrekt?


    Gruß ttlong
    Zuletzt editiert von ttlong; 29.03.2011, 15:11.

  • #2
    Code:
    BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND $timenow
    Hier vergleichst du den STRING 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' mit dem INTEGER des UNIX-Timestamps!

    Selbst wenn du es richtig notierst würdest du den MySQL-Timestamp mit einem UNIX-Timestamp vergleichen!


    PS Formatierung von SQL in Beiträgen
    Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Hallo,

      wenn UNIX-Timestamps einen Vorteil haben, dann den das man einfach damit "rechnen" kann. 4 Tage zurück bedeutet einfach:
      Code:
      $timenow - (4 * 24 * 60 * 60);
      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Ok,

        aber dann sollte doch ein:

        [highlight=sql]BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND NOW()[/highlight]

        zum Erfolg führen oder? Es liegen dann beide Werte als MySQL-Timestapms vor?! (es geht aber auch das nicht). Oder hab ich irgendwo komplett nen Denkfehler drinn?


        Originally posted by Falk Prüfer View Post
        Hallo,

        wenn UNIX-Timestamps einen Vorteil haben, dann den das man einfach damit "rechnen" kann. 4 Tage zurück bedeutet einfach:
        Code:
        $timenow - (4 * 24 * 60 * 60);
        Gruß Falk
        Das umwandeln bzw rechnen auf PHP-Ebene ist nicht das Problem, siehe erster Beitrag von mir:

        $timeline = strtotime("-4 days");

        Es soll aber auf DB-Eben gerechnet werden, weil die Performance schlicht besser ist/besser sein wird bei mehreren tausend Berechnungen am Tag.

        Comment


        • #5
          Du vergleichst immer noch ein STRING mit einem Datumswert

          Bitte die Grundlagen nochmals studieren, wie notiere ich eine Funktion in SQL.

          Komischerweise machst du es bei NOW() richtig.

          Edit:
          Es soll aber auf DB-Eben gerechnet werden, weil die Performance schlicht besser ist/besser sein wird bei mehreren tausend Berechnungen am Tag.
          Den Vorteil hättest du aber nur wenn du vernünftige Datumsfelder nutzen würdest, bei UNIX-Timestamps ist es aber tatsächlich besser die Berechnung der Timestamps vorher in PHP durchzuführen, da MySQL dann auch vorhandene Index nutzen kann.
          Zuletzt editiert von dibo33; 29.03.2011, 15:33.
          Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

          Comment


          • #6
            Kurz gesagt:
            Anstatt
            Code:
              BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND NOW()
            sollte es
            Code:
             BETWEEN DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY) AND NOW()
            heissen.

            Comment


            • #7
              Originally posted by ttlong View Post
              ...Es soll aber auf DB-Eben gerechnet werden, weil die Performance schlicht besser ist/besser sein wird bei mehreren tausend Berechnungen am Tag.
              Was hindert dich daran die gleiche Berechnung auf DB-Ebene durchzuführen?
              [highlight=sql]
              ...
              BETWEEN $timenow - (4*24*60*60) AND $timenow
              [/highlight]

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Originally posted by iACOi View Post
                Kurz gesagt:
                Anstatt
                Code:
                  BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND NOW()
                sollte es
                Code:
                 BETWEEN DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY) AND NOW()
                heissen.
                Unter der Voraussetzung dass das abgefragte DB-Feld ein MySQL-DateTime ist! Du sagst aber, dass dort ein Unix-Timestamp gespeichert ist, also vergleichst du wieder Äpfel mit Birnen!

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Originally posted by iACOi View Post
                  Kurz gesagt:
                  Anstatt
                  Code:
                    BETWEEN 'DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY)' AND NOW()
                  sollte es
                  Code:
                   BETWEEN DATE_SUB(FROM_UNIXTIME($timenow),INTERVAL 4 DAY) AND NOW()
                  heissen.
                  Das habe ich probiert, nachdem ich drauf gekommen bin was an der Syntax falsch war ;-)

                  Dies führt aber komischerweise dazu, dass als Result '0' entsteht.

                  Die Funktion: FROM_UNIXTIME() wandelt doch aber einen UNIX-Timestamp in ein von MySQL verstandes Datum um, oder? zumindes lese ich das so aus der Doku.

                  Ich habe mich aber nun doch dazu entschieden, meinen PHP-Code entsprechend zu ändern und die Spalte mit dem Typ 'timestamp' inkl. on update zu versehen. Die Berechnungen wie von mir gewollt laufen damit nun wie gewünscht.


                  Vielen Dankfür eure Antworten.

                  Gruß ttlong

                  Comment

                  Working...
                  X