Durchnschnittliche Dauer berechnen (Datum)

atlantyz

Erfahrenes Mitglied
Hallo Leute,

ich hab ein Problem und weiß einfach nicht wie ich das angehen kann.

Also: ich habe zwei unterschiedliche Datumsangaben (z.B. 12.10.2008 13:00 und 15.10.2008 14:25).

Nun habe ich die Differenz zwischen den beiden gebildet. Soweit so gut. Nun mein Problem:

Ich möchte alle Differenzen zusammen zählen und dann den Durchschnittswert ermitteln.

ABER... ich weiß am Anfang noch nicht, wieviele Differenzen das System bildet (also muss wohl ne Schleife her) und vorallem: ich weiß nicht, wie ich den Durchschnitt aus nem Datum errechnen lasse. Geht das besser über den timestamp (der liegt bei allen Datumsangaben ebenfalls vor) oder besser über die Differenz (die liegt in einem array vor mit den Angaben Tage, Stunden, Minuten, Sekunden).

Von der Logik her wäre das doch so:

ich zähl alle Differenzen zusammen und teile dann durch die Anzahl der Differenzen, richtig?

Leider weiß ich nicht, wie ich das mache, wenn ich die Anzahl noch nicht weiß und eben, ob es besser ist mit der Differenz als timestamp oder als einzelne werte zu rechnen.

Bin noch Anfänger....

Bitte um Hilfe
 
Mit den Unix timestamp lässt sich besser rechnen. Wenn die Anzahl noch nicht bekannt ist und ich dich richtig verstehe, wäre ein Weg über eine Normalverteilung.
 
Es kommt darauf an, woher die Daten kommen. Kommen die Daten aus einer Datenbank, durchläufst du sowieso eine while Schleife und kannst dabei einen Zähler mitlaufen lassen. Liegen die Daten in einem Array, durchläufst du es z.B. mit foreach und kannst mit count die Anzahl der Daten erfahren. Ansonsten erläutere das doch mal etwas genauer.
 
Hallo atlantyz.

Das mit der Schleife ist richtig.
Addiere doch in einer Schleife einfach alle timestamps, und lasse nebenher einen counter hochzählen.
Ich weiß jetzt nicht, wo das Datum vorliegt, aber das kann man mit strtotime() lösen.
Alternativ kannst du auch einfach die Timestamps der beiden Daten verrechnen, kommt aufs gleiche raus.

Zur Ausgabe des Unterschieds solltest du dir mal gmdate() angucken.
Im Format von gmdate() zählt für dich wohl nur
z: Tag des Jahres
H: Stunde mit führender Null
i: Minute mit führender Null
s: Sekunde mit führender Null.
Funktioniert allerdings nur bei differenzen von unter einem Jahr.

PHP:
<?php
  //Beispiel 12.10.2008 13:00:54
  $date1 = strtotime("20081012, 130054");    
  //Beispiel 10.10.2008 11:57:53
  $date2 = strtotime("20081010, 115753");
  $stamp = $date1-$date2;
  
  //Differenz ausgeben lassen
  echo "Differenz: ";               
  echo gmdate("z", $stamp); //Tag des Jahres
  echo " Tage, ";
  echo gmdate("H:i:s", $stamp); // Uhrzeit
  echo " Stunden.", "<br/>";

  //Beispielschleife
  $counter = 0;
  for($counter; $counter < count($differenzArray); $counter++){
    //Timestamps errechnen
    $differenz = strtotime(Enddatum) - strtotime(Anfangsdatum);
    //Timestamps addieren
    $stamp+= $differenz;  
  }

  $stamp = $stamp/$counter; //Durchschnitt errechnen
  echo "Differenz: ";               //Ausgabeder Differenz
  echo gmdate("z", $stamp);
  echo " Tage, ";
  echo gmdate("H:i:s", $stamp);
  echo " Stunden.", "<br/>";
?>

So... ich hoffe da ist alles drin.

Bei Frage - fragen :)
 
Zuletzt bearbeitet:
Hi,

ich habe mir die Berechnung der Differenz nun so zusammengebastelt, dass es funktioniert. Aber meiner Meinung nach "rechnet" der einfach falsch.

Ich lasse alle Differenzen aus einem Anfangs-und Endwert berechnen und mir einzeln ausgeben. Anschließend werden alle Timestamps nochmals zu einem Gesamtwert addiert und daraus der Gesamte-Durchschnittswert berechnet.

Als Beispiel:

Ticket 1 - Dauer bis zur Erledigung: 15 Tage 8 Stunden 5 Minuten
Ticket 2 - Dauer bis zur Erledigung: 3 Tage 7 Stunden 8 Minuten

Gesamte Bearbeitungszeit: etwas um die 9 Stunden (mitm Kopf ausgerechnet).
Gesamte Bearbeitungszeit laut meiner Formel: etwas um 1 Stunde herum.

Hier der Code:

PHP:
function ticket_durchschnitt_alle($ergebnis)
{
//Es wird ein Array erstellt, welches alle Timestamps der Tickets (ein Timestamp pro Ticket) aufnimmt.
   $timestamp_ticket = array();
//Das Ergebnis der SQL-Abfrage wird durchlaufen um die Ticket Timestamps zu ermitteln. Das Ergebnis der Abfrage wird an die Funktion übergeben.
    while ($ticket = mysql_fetch_assoc($ergebnis))
     {
//Die ermittelte Differenz wird im Array abgespeichert.
      $timestamp_ticket[] = $ticket["his_datum"] - $ticket["ticket_datum"];
     }
//Die Anzahl der Array Einträge wird ermittelt und gespeichert.
    $anzahl = count($timestamp_ticket);
//Die Werte des Arrays werden zusammen addiert und in der Variablen $summe gespeichert.
    for($i=0; $i < count($timestamp_ticket); $i++)
      {
      $summe = $summe + $timestamp_ticket[$i];
      }
    if (count($timestamp_ticket) != '0')
    {
//Der Durchschnitt aller Timestamps wird ermittelt.
    $durchschnitt = $summe / $anzahl;
    }
//Der Timestamp wird über die Funktion ticket_dauer in Tage, Stunden, Minuten und Sekunden zerlegt und in einem Array gespeichert.
//Dieses Array wird an die aufrufende Stelle zurückgegeben.
    $dauer = ticket_dauer($durchschnitt);
    return $dauer;

Es ist egal, wie lange die durchschnittliche Zeit eines Tickets ist, als Gesamt Ergebnis bekomme ich nie mehr als etwa ne Stunde.

Nochmal zur Erklärung: his_datum und ticket_datum sind jeweils ein Timestamp und kommen aus der Datenbank. his_datum ist dabei das Datum, zu der das Ticket erledigt wurde, ticket_datum das Datum, als es erstellt wurde
 
Zuletzt bearbeitet:
Wo bekommst Du denn den Wert für $summe her?

PHP:
//Die Werte des Arrays werden zusammen addiert und in der Variablen $summe gespeichert.
    for($i=0; $i < count($timestamp_ticket); $i++)
      {
      $summe = $summe + $timestamp_ticket[$i];
      }
    if (count($timestamp_ticket) != '0')
    {
//Der Durchschnitt aller Timestamps wird ermittelt.
    $durchschnitt = $summe / $anzahl;
    }
 
Ganz einfach:

im ersten Durchlauf ist der 0, weil ich ihn ja nicht festgelegt habe und danach ist es der Timestamp, der drin steckt.

Also erstmal so: 0 + timestamp1, im nächsten Durchlauf: 0+timestamp1+timestamp2 usw.

(ich habs getetste... wenn ich $summe vorher auf 0 festlege, dann kommt das gleiche Ergebnis raus, daran liegts also nicht)
 
Zurück