Syntax für Zeitdifferenz mit "datetime"

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

  • Syntax für Zeitdifferenz mit "datetime"

    Ich konnte bisher keine hilfreiche Info finden zu dem Thema, wie man mit MySQL aus zwei "datetime"-Werten die Differenz bildet und die Ausgabe in "Std:Min" erhält.
    Oder lässt sich das mit PHP eleganter lösen. Der Differenz Wert wird ebenfalls als "time" in der Datenbank gespeichert.
    Könnte mir dabei mal jemand helfen?

  • #2
    hab keine funktion gefunden, die dir das liefert (extract wollte bei mir nich so auf die schnelle), aber es geht auf jedenfall mit den funktionen hier:
    http://www.mysql.com/doc/de/Mathematical_functions.html

    besonders FLOOR und MOD sind eine lektüre wert
    Zuletzt geändert von mrhappiness; 21.09.2003, 19:24.
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      So, ich hab das ganze jetzt mal in auf einer Internetseite so gefunden.
      Habe 2 datetime-Werte aus der Datenbank, die ich auslese.
      Das ist der Code zur Berechnung:

      PHP-Code:
      $newDate mktime($stop_zeit_std$stop_zeit_min'00'$stop_datum_monat$stop_datum_tag$stop_datum_jahr);      // Zeiteintrag
      $actDate strtotime($time['tag_stoerstart_zeit']);                     // aktuelle Zeit im Unixformat erzeugen
      $diffDate = ($newDate-$actDate);         // Differenz berechnen (in Sekunden)

      $days floor($diffDate 24 60 60 );   // Anzahl Tage = Sekunden /24/60/60
      $diffDate $diffDate - ($days*24*60*60);   // den verbleibenden Rest berechnen = Stunden
      $hours floor($diffDate 60 60);      // den Stundenanteil herausrechnen
      $diffDate = ($diffDate - ($hours*60*60));
      $minutes floor($diffDate/60);            // den Minutenanteil
      $diffDate $diffDate - ($minutes*60);
      $seconds floor($diffDate);             // die verbleibenden Sekunden

      echo $time['tag_stoerstart_zeit']. "<br>";
      echo 
      $time['tag_stoerstop_zeit']. "<br>";
      echo 
      $newDate "<br>";
      echo 
      $actDate "<br>";
      echo 
      "$days Tage, $hours Stunden, $minutes Minuten und $seconds Sekunden<br>"
      Start-Datum: 2003-08-28 12:15:00
      Stop-Datum: 2003-08-29 12:30:00

      Als Ergebnis kommt jedoch raus: 84 Tage, 0 Stunden, 15 Minuten und 0 Sekunden

      Kommentar


      • #4
        So, das obige Ergebnis war immer noch nicht das was ich wollte, Problem hatte sich gelöst. Jetzt hab ich endlich das was ich will mit diesem Code:

        PHP-Code:
        $Date1 mktime($start_zeit_std$start_zeit_min"00"$start_datum_monat$start_datum_tag$start_datum_jahr);      // Zeiteintrag
        $Date2 mktime($stop_zeit_std$stop_zeit_min"00"$stop_datum_monat$stop_datum_tag$stop_datum_jahr);      // Zeiteintrag
        if ($Date1 $Date2)
            {
                
        $diffDate = ($Date1 $Date2);
            }
        $diffDate = ($Date2 $Date1);

        $std floor($diffDate 60);
        $min = ($std 60);
        $std = ($std $min);
        echo 
        $time['tag_stoerstart_zeit']."<br>";
        echo 
        $time['tag_stoerstop_zeit']."<br>";
        echo 
        "$std"." Stunden&nbsp;&nbsp;".$min." Minuten"
        Funzt wunderbar, aber wie es immer so schön ist funktioniert jetzt die Zeitüberschneidung bei Mitternacht nicht mehr, d.h. 28.09.03 23:45 bis 29.09.03 00:15 ergibt nun 1380 Stunden. *verdammt*
        Das muss doch zu machen sein..... HILFE!

        Kommentar


        • #5
          Habs rausgefunden, man muss die Funktion "strtotime" nehmen, und schon geht's:

          PHP-Code:
          $abfrage mysql_query("SELECT tag_stoerstart_zeit, tag_stoerstop_zeit FROM tagesstatus WHERE tag_id=1");
          $time mysql_fetch_array($abfrage);

          $Date1 strtotime($time['tag_stoerstart_zeit']);      // Zeiteintrag
          $Date2 strtotime($time['tag_stoerstop_zeit']);      // Zeiteintrag
          if ($Date1 $Date2)
              {
                  
          $diffDate = ($Date1 $Date2);
              }
          else 
          $diffDate = ($Date2 $Date1);

          $std floor($diffDate 60);
          $min = ($std 60);
          $std = ($std $min);
          echo 
          $time['tag_stoerstart_zeit']."&nbsp;".$Date1."<br>";
          echo 
          $time['tag_stoerstop_zeit']."&nbsp;".$Date2."<br>";
          echo 
          "$std"." Stunden&nbsp;&nbsp;".$min." Minuten"

          Kommentar


          • #6
            Der Code oben ergab bei mir Chaos, also habe ich Dein Script etwas modifiziert.
            Dabei habe ich mir erst an diesem Modulus (%) in zeile "$min = ($std % 60);"
            die Zähnchen ausgebissen aber es gibt ja fmod()

            $abfrage = mysql_query("SELECT tag_stoerstart_zeit, tag_stoerstop_zeit FROM tagesstatus WHERE tag_id=1");

            $time = mysql_fetch_array($abfrage);

            echo timediff($time['tag_stoerstart_zeit'],$time['tag_stoerstop_zeit']);

            function timediff($frueh, $spaet="now")
            {
            $time1 = strtotime($frueh); // umwandeln in UNIX-Zeitstempel
            $time2 = strtotime($spaet);
            if ($time1 > $time2) $secdiff = ($time1 - $time2);
            else $secdiff = ($time2 - $time1);

            $std = floor($secdiff / 3600);
            $min = floor(fmod($secdiff,3600)/60);
            $sec = fmod($secdiff,60); // $secdiff/60 und verwende ganzzahligen Rest
            return $str.":".$min.":".$sec;
            }

            Sammle Zeitfunktionen: Verlängert das Leben!
            Zuletzt geändert von pareto; 07.01.2004, 19:42.

            Kommentar


            • #7
              kurz und knackig
              Code:
              select
                 stoerstart,
                 stoerstop,
                 SEC_TO_TIME(UNIX_TIMESTAMP(stoerstop)-UNIX_TIMESTAMP(stoerstart)) stoerdauer
              from
                 tagestatus
              TBT

              Die zwei wichtigsten Regeln für eine berufliche Karriere:
              1. Verrate niemals alles was du weißt!


              PHP 2 AllPatrizier II Browsergame

              Kommentar


              • #8
                Hi , habe es so ähnlich versucht, bekomme nur nicht folgendes nach der zeitdifferenz aufsteigend sortiert :

                select
                logo_link ,
                logo_date_end ,
                logo_date_beginn,
                (UNIX_TIMESTAMP(logo_date_end)-UNIX_TIMESTAMP(logo_date_beginn)) as diff
                from tab_logo
                order by diff asc


                Wat mach ich nur falsch ?

                Kommentar


                • #9
                  was geht denn nicht ?

                  Fehlermeldungen ?
                  TBT

                  Die zwei wichtigsten Regeln für eine berufliche Karriere:
                  1. Verrate niemals alles was du weißt!


                  PHP 2 AllPatrizier II Browsergame

                  Kommentar


                  • #10
                    uups, hatte ich vergessen, also es gibt keine fehlermeldung , sondern er gibt mir die daten schon aus, aber er sortiert halt nich..

                    Kommentar

                    Lädt...
                    X