MYSQL: Aus Timestamps Zeitdifferenzen bestimmen
Snookie
- datenbank
Liebes Forum,
ich kenne mich mit MySql noch nicht so besonders aus.
Habe bisher Hilfe unter mysql.de gesucht aber nichts gefunden.
Mein Problem ist dieses.
Ich möchte feststellen, wie lange ein User auf einer bestimmten Seite benutzt.
Dazu werden immer beim Neuaufruf der Seite timestamps in eine Datenbank eingetragen.
Jetzt möchte ich aus dem max. und dem minimalen timestamp eine Zeit ermitteln, also x Stunden, y Minuten und z Sekunden.
Ich habe folgendes probiert:
MAX(onlineTimestamp
) - MIN(onlineTimestamp
)
Das liefert mir bei 20050214185450 - 20050214185536 einen Wert von 86.
Wie kann ich daraus Stunden Minuten und Sekunden ermitteln?
Ein anderer Versuch war dieser:
SUBSTRING(MAX(onlineTimestamp
), 9, 2) - SUBSTRING(MIN(onlineTimestamp
), 9, 2) AS Stunden
,
SUBSTRING(MAX(onlineTimestamp
), 11, 2) - SUBSTRING(MIN(onlineTimestamp
), 11, 2) Minuten
,
SUBSTRING(MAX(onlineTimestamp
), 13, 2) - SUBSTRING(MIN(onlineTimestamp
), 13, 2) AS Sekunden
Das liefert mir 0(Stunden) 1(Minuten) und -14(Sekunden).
Beide Ergebnisse liefern mir (noch) nicht das was ich suche.
Jetzt habe ich online schon nach Zeitfunktionen in mysql gesucht, bin aber nicht fündig geworden.
Kann mir jemand weiterhelfen?
Gruss und Dank,
Snookie
Halihallo Snookie
Jetzt möchte ich aus dem max. und dem minimalen timestamp eine Zeit ermitteln, also x Stunden, y Minuten und z Sekunden.
Jetzt habe ich online schon nach Zeitfunktionen in mysql gesucht, bin aber nicht fündig geworden.
Wandle die MySQL-TIMESTAMPS mittels UNIX_TIMESTAMP
in "richtige" Unix-Timestamps um und subtrahiere diese: dies ergibt die
Anzahl Sekunden zwischen beiden Daten.
oder verwende TIMESTAMPDIFF(SECOND, ts1, ts2) [MySQL>=5.0]
Viele Grüsse
Philipp
Die Lösung kam ja schon von Philipp Hasenfratz, hier nur als Ergänzung
MAX(
onlineTimestamp
) - MIN(onlineTimestamp
)
Das liefert mir bei 20050214185450 - 20050214185536 einen Wert von 86.
Wenn du mal genauer hinschaust, erkennst du, dass die beiden Werte ein Datum mit Uhrzeit ohne Trennzeichen dazwischen darstellt. Das kann man nicht sinnvoll mit einer einfachen Addition/Subtraktion berechnen.
In einem Unix-Timestamp ist stattdessen die Anzahl der Sekunden seit 1.1.1970 (Unix' Geburtsdatum) enthalten. Damit kann man rechnen...
Hi,
In einem Unix-Timestamp ist stattdessen die Anzahl der Sekunden seit 1.1.1970 (Unix' Geburtsdatum) enthalten. Damit kann man rechnen...
danke, aber wie rechne ich damit?
Wenn mir UNIX_TIMESTAMP(MAX(onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(`onlineTimestamp
einen Wert von 49 (Sekunden) liefert, dann sollte mir
FROM_UNIXTIME(UNIX_TIMESTAMP(MAX(onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
)), '%T')
00:00:49 liefern.
ich erhalte aber 01:00:49 !
Warum?
gruss.
Snookie
hi,
einen Wert von 49 (Sekunden) liefert, dann sollte mir
FROM_UNIXTIME(UNIX_TIMESTAMP(MAX(
onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
)), '%T')00:00:49 liefern.
ich erhalte aber 01:00:49 !
Warum?
weil der unix timestamp sich auf GMT bezieht.
00:00:49 GMT im lokalen datumsformat für MEZ ist nun mal 01:00:49 (wenn wir sommer-/winterzeit mal außen vor lassen).
gruß,
wahsaga
danke, aber wie rechne ich damit?
Wenn mir UNIX_TIMESTAMP(MAX(
onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(`onlineTimestampeinen Wert von 49 (Sekunden) liefert, dann sollte mir
Das ist soweit richtig gerechnet
FROM_UNIXTIME(UNIX_TIMESTAMP(MAX(
onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
)), '%T')00:00:49 liefern.
ich erhalte aber 01:00:49 !
Warum?
Das wusste ich gestern auch nicht, aber heute kam mir der Einfall, dass es was mit Zeitzonen zu tun haben könnte.
Und so ist es auch, klärte mich das Handbuch auf. Der Unix Timestamp bezieht sich auf GMT und da dein Server sicher unter MEZ läuft, ...
Dein Ergebnis 49 ist nun eine Anzahl Sekunden und kein Timestamp mehr. Das Umzurechnen gibt es SEC_TO_TIME()
HI,
Das wusste ich gestern auch nicht, aber heute kam mir der Einfall, dass es was mit Zeitzonen zu tun haben könnte.
Und so ist es auch, klärte mich das Handbuch auf. Der Unix Timestamp bezieht sich auf GMT und da dein Server sicher unter MEZ läuft, ...Dein Ergebnis 49 ist nun eine Anzahl Sekunden und kein Timestamp mehr. Das Umzurechnen gibt es SEC_TO_TIME()
Danke, genaus das ist die Lösung.
Gruess,
S.
Hallo,
danke für die Hilfe bisher.
Nun habe ich mich ein wenig eingelesen ind folgendes probiert:
FROM_UNIXTIME(UNIX_TIMESTAMP(MAX(onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
)), '%T')
Bei 46 Sekunden
[UNIX_TIMESTAMP(MAX(onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
))] => 46
sollte mir
FROM_UNIXTIME(UNIX_TIMESTAMP(MAX(onlineTimestamp
)) - UNIX_TIMESTAMP(MIN(onlineTimestamp
)), '%T')
doch einen Wert von 00:00:46 liefern.
Ausgegeben wird aber 01:00:46 !
Warum das? Mache ich da noch etwas falsch?
Gruss,
Snookie