balu: time-timestamp konvertierung (mysql/php)

Hallo!

Ich möchte folgende Redundanz in meiner Datenbank beseitigen; zur Anzeige des Datums sowie zur leichten Lesbarkeit der Einträge in der Datenbank ist im Feld "db1_time"(datetime) die Zeit durch den MySql-Befehl Now() gespeichert. dh inhalt des feldes ist ein datum im Format '000-00-00 00:00:00'.

Zusätzlich ist der Unix-Timestamp im Feld "db1_timestamp"(int(11)) gespeichert. Ich benötige ihn um verschiedene Zeitberechungen durchzuführen.

Die Felder sind allerdings vollkommen redundant. Abhilfe würde mir allerdings nur eine möglichkeit bieten, aus dem '000-00-00 00:00:00'-Datum den U-Timestamp zu berechnen. die funktion "strtotime" hilft mir nicht weiter (gibt nur den Fehler '-1' zurück).
Ein Umweg oder eine andere Funktion würde wahrscheinlich abhelfen, nur konnte ich nichts passendes finden.

weiß jemand, wass ich machen könnte?

danke,
balu

  1. Tach Balu,

    versuch es mal mit

    strftime ( string format [, int Timestamp])

    genaue Anleitung unter: http://www.php.net/manual/de/function.strftime.php

    ciao, fipps

    Hallo!

    Ich möchte folgende Redundanz in meiner Datenbank beseitigen; zur Anzeige des Datums sowie zur leichten Lesbarkeit der Einträge in der Datenbank ist im Feld "db1_time"(datetime) die Zeit durch den MySql-Befehl Now() gespeichert. dh inhalt des feldes ist ein datum im Format '000-00-00 00:00:00'.

    Zusätzlich ist der Unix-Timestamp im Feld "db1_timestamp"(int(11)) gespeichert. Ich benötige ihn um verschiedene Zeitberechungen durchzuführen.

    Die Felder sind allerdings vollkommen redundant. Abhilfe würde mir allerdings nur eine möglichkeit bieten, aus dem '000-00-00 00:00:00'-Datum den U-Timestamp zu berechnen. die funktion "strtotime" hilft mir nicht weiter (gibt nur den Fehler '-1' zurück).
    Ein Umweg oder eine andere Funktion würde wahrscheinlich abhelfen, nur konnte ich nichts passendes finden.

    weiß jemand, wass ich machen könnte?

    danke,
    balu

    1. versuch es mal mit

      strftime ( string format [, int Timestamp])

      Hallo!
      Leider hilft mir dein tipp nicht weiter. die funktion strftime verlangt ja den timestamp um ihn weiter zu formatieren.

      Da ich ja die (für menschen) leserliche Variante der Zeit in der Datenbank behalten möchte, muss _diese_ als Grundlage für die Erstellung des Timestamps heranziehen, nicht umgekehrt.

      also wie wird mittels php beispielsweise AUS
      demhier "2002-09-03 21:02:14"
                    ||
                    /
      dashier "1031079671"

      gibt es dazu eine funktion? einen umweg? eine idee?

      1. also wie wird mittels php beispielsweise AUS
        demhier "2002-09-03 21:02:14"
                      ||
                      /
        dashier "1031079671"

        Mit PHP beispielsweise so:

        function time_mysql2unix($date) {
          list($year,$month,$day,$hour,$minute,$second)=split('[-:\ ]',$date);
          return mktime($hour,$minute,$second,$month,$day,$year);
        }

        echo time_mysql2unix('2002-09-03 21:02:14'); /* 1031079734 */

        ... oder auch ein bißchen kompakter:

        echo preg_replace('/(\d+)-(\d+)-(\d+)\ (\d+):(\d+):(\d+)/e','mktime($4,$5,$6,$2,$3,$1)','2002-09-03 21:02:14');

        Ich würde allerdings tunlichst auf MySQL-Bordmittel zurückgreifen:

        $query='SELECT time,UNIX_TIMESTAMP(time) as unixtime '
              .'FROM ... '
              .'WHERE ... '
              .'ORDER BY ...';
        $result=mysql_query($query) or die(mysql_errno().': '.mysql_error());

        while($row=mysql_fetch_object($result)) {
          echo $row->time,': ',$row->unixtime,"\n";
        }

  2. Hallo,

    Die Felder sind allerdings vollkommen redundant. Abhilfe würde mir allerdings nur eine möglichkeit bieten, aus dem '000-00-00 00:00:00'-Datum den U-Timestamp zu berechnen. die funktion "strtotime" hilft mir nicht weiter (gibt nur den Fehler '-1' zurück).
    Ein Umweg oder eine andere Funktion würde wahrscheinlich abhelfen, nur konnte ich nichts passendes finden.

    MySQL kennt die Funktion unix_timestamp() [auch unter Windows]:

    select unix_timestamp(datumsfeld) from tabelle;

    MfG, Thomas

    1. select unix_timestamp(datumsfeld) from tabelle;

      Hallo Thomas!

      Klingt nach einer tollen Idee! danke.

      ich hab das gerade ausprobiert, allerdings hab ich's noch nicht geschaft, den timestamp herauszubekommen.

      [Feld mit datum&zeit (0000-00-00 00:00:00) heißt "time"; $conn stimmt;]

      aber mit dem Code:
      --------------------------------
      $query = "SELECT time FROM meinetabelle ORDER BY time DESC";
      $times = mysql_query($query,$conn);
      $time = mysql_fetch_row($result);

      $query2 = "SELECT unix_timestamp(time) FROM meinetabelle ORDER BY time DESC";
      $tstamps = mysql_query($query2,$conn);
      $tstamp = mysql_fetch_row($tstamps);

      echo "time is:";
      echo $time[0];
      echo "<br> it's timestamp is:";
      echo $tstamp[0];
      --------------------------------
      ..bekomme ich als ergebnis:

      time is:2002-09-03 21:02:14
      it's timestamp is:

      ..was mache ich falsch, dass ich keinen Timestamp angezeigt bekomme?

      1. Hallo,

        [Feld mit datum&zeit (0000-00-00 00:00:00) heißt "time"; $conn stimmt;]

        aber mit dem Code:

        $query = "SELECT time FROM meinetabelle ORDER BY time DESC";
        $times = mysql_query($query,$conn);
        $time = mysql_fetch_row($result);

        ^^^
                                   $times sollte hier stehen

        ..was mache ich falsch, dass ich keinen Timestamp angezeigt bekomme?

        Das sollte vom Code her funktionieren. Hast Du vielleicht eine uralte MySQL-Version am Start? Ansonsten ist es sinnvoll, erstmal an der MySQL-Konsole zu testen.

        MfG, Thomas