Unixtimestamp in MySQL umformatieren

chrigu

chrigu

Aktives Mitglied
Thread Starter
Dabei seit
08.03.2004
Beiträge
155
Reaktionspunkte
0
Hallo,

Ich habe in einer Tabelle Spalten definiert, die mit einem Datum 'YYYY-MM-DD' (Datentyp: date) und Zeitangabe 'HH-MM-SS' (Datentyp: time) versehen sind.

Nun möchte ich die Einträge/Zeilen auslesen und zwar solche die sich innerhalb eines definierten Datums befinden. Bei den betreffenden Zeilen soll das Gesamttotal der Zeitangabe berrechnet werden. Dazu habe ich folgenden SQL Befehl geschrieben:

PHP:
SELECT SUM(`Zeitangabe`) FROM `Tabelle` WHERE `Datum` BETWEEN '2004-10-25' AND '2004-10-29' LIMIT 1

Nun bekomme ich eine mehrstellige Zahl. Ich nehme an, dass es sich um den Unixtimestamp handelt. Wie kann ich den nun umformatieren, das wieder eine Zeitangabe HH-MM-SS entsteht. Zum Beispiel 68:50:00.

Gruess Chrigu
 
Hm!? Ob es das ist, was Du suchst?

select time_format(sum(datum),'%H:%i:%s')

in obige AAnweisung, brächte das Ergebnis, ABER: Die datumsangaben werden in mysql intern einfach nur als Zahlen (timestmp ähnlich) gespeichert. Du summierst also auch die Jahre, Tage Monate und die Uhrzeit auf, respektive deren Entsprechung als Integer! Ob das Ergebnis überhaupt stimmig ist wage ich zu bezweifeln.
Wenn Du aufgewendete Zeiten haben möchtest, würde ich ggf. anders speichern. Ich mache hier mit einem Webserver Statistiken über eine Firmen-TK-Anlage und speichere z.B. Gesprächsdauer geziehlt als int über minuten! Du kannst nat auch als datetime speichern und dann per date_format(datum,'%H:%i:%s') daraus nur die Zeit ausschneiden, aber solche Konvertierungen kosten Zeit. Da man meist mehr liest als schreibt, bietet es sich an, so in die DB zu schreiben, wie Du auslesen willst.
 
Uups, theoretisch wäre TIME_FORMAT(SUM(time), '%H:%i:%s') schon das gesuchte gewesen, wenn denn das Datenfeld Time als solches summiert würde und nicht als "Entsprechung im Integer" Grmpf…

Dachte beim erstellen der Datenbank, ich definiere ein Zeitformat als Time damit ich dann per MySQL komfortabel Zeiten zusammen zählen kann, daraus wird wohl nichts, oder?

Die Datenfelder will ich nicht mehr umwandeln, weil bereits seit langem erstellt und ich viel ändern müsste. Es bleibt mir wohl nichts mehr anderes übrig als in PHP das Ergebnis in ein Array zu laden und mit schleife zu konvertieren und zusammen zu zählen.
 
ich habe das jetzt nicht im einzelnen getestet, ob das in mysql ein echter timestamp ist, dann kannst Du ja ggf. damit rechnen, mußt Du halt mal probieren. Wenn Du das häufig brauchst, würd ich das Design erweitern. Füg eine Spalte

delta_zeit unsigned int

hinzu und berechne einmalig alle delta_zeit-Werte. Zukünftig trägst Du die Zeit dann dort umgerechnet in ganze Minuetn oder Sekunden ein. et voila!
 
Danke euch fürs weiterhelfen, zum Glück führen immer verschiedene Wege zum Ziel.

Ich kenne zwar den Unterschied zwischen den verschiedenen Timestamps nicht, aber es war tatsächlich so, dass die Summe eine falsche Zeit lieferte.

MySQL kennt scheinbar wenigstens eine Time to sec Funktion, in PHP musste ich mir die selber schreiben, die Schleife ist mir aber nun doch erspart worden :).
 
Denk aber daran, daß nur mysql das so in der Art macht! Ich verwende so etwas nur im Notfall, weil es eben nicht portabel ist!
 
Ok, ich hab mich doch ein bisschen zu früh gefreut :-( , weil folgender MySQL Befehl Ergebnis NULL liefert:

"SELECT SUM(TIME_TO_SEC(`Zeitangabe`)) FROM `Tabelle` WHERE 'Datum' BETWEEN '2004-10-26' AND '2004-10-29'"

Hingegen funktioniert das Ganze ohne Bedingung, also so:

"SELECT SUM(TIME_TO_SEC(`Zeitangabe`)) FROM `Tabelle`"

und liefert ein korrektes Ergebnis der Summe in Sekunden. Es scheint also noch an der Bedingung zu liegen, die Daten zwischen dem 2004-10-26 und dem 2004-10-29 existieren in der enstprechenden Spalte 'Datum', womit ich mich langsam Frage, ob MySQL überhaupt ein Datum mit einem anderen so vergleichen kann.
 
Gut, hab den Fehler gefunden. Ich hatte die falschen Anführungszeichen bei `Datum` verwendet. Nun funktionierts definitiv :)
 
Zurück
Oben Unten