MySQL Vergangene Zeit in Sekunden - Was ist am schnellsten?

DaPhreak

Primus inter pares
ID: 30143
L
8 Mai 2006
2.418
295
Hallo alle, ich mal wieder,


Ich habe häufig das Problem, dass ich wissen muss, wieviele Sekunden ein bestimmtes Event her ist. Dazu lege ich also pro Event einen Datensatz an, der mit NOW() aktuelles Datum+Uhrzeit speichert. Nun frage ich mich, was dafür eigentlich die beste Variante ist, die vergangene Zeit in Sekunden zu bestimmen.

Eigentlicht sieht die Variante ja ganz gut aus:
Code:
SELECT TIMESTAMPDIFF(SECOND,`when`,NOW()) FROM <table>;

... die erfodert aber MySQL5 und ich habe zum Teil nur auf MySQL 4.1 Zugriff. Eine Variante die in MySQL4 geht wäre die:

Code:
SELECT TIME_TO_SEC(TIMEDIFF(NOW(), `when`)) FROM <table>;

... nur weiß ich nicht wie flott das ist mit den zwei Funktionen die das braucht.

Eventuell wäre das rechnen mit TIMESTAMPs ja schneller. Die brauchen auch nur 32 Bit. Allerdings liefert MySQL selbst einen TIMESTAMP-Datentyp seit MySQL 4.1 auch formatiert wie ein Datum zurück, so dass man auch hier nochmal umwandeln müsste. Was geht ist:

Code:
SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(`when`) FROM <table>;

Subtraktion der 32Bit-Ints dürfte schnell sein, aber 2x UNIX_TIMESTAMP()? Außerdem ist die Variante natürlich nicht Year-2038-safe. Aber ob ich mir darüber wirklich Gedanken machen muss?


Was würdet ihr empfehlen?
 
Außerdem ist die Variante natürlich nicht Year-2038-safe. Aber ob ich mir darüber wirklich Gedanken machen muss?
nein musst du nicht, selbst Linux ist dafür noch nicht gewappnet, in den nächsten Jahren wird für den Unix-Timestamp einfach der Bitbereich vergrößert, bis es relevant wird, ist schon überall das Problem behoben.


Was würdet ihr empfehlen?
die intuitivste Variante ;)
Alle 3 genannten Methoden sollten in etwa gleich schnell sein, alles darüber hinaus sind nur unsinnige Microbenchmarks ;)
 
Okay, super, ich danke Dir!

So gesehen tendiere ich ein bisschen zu der Variante mit TIMESTAMPs als Datentyp, da die ja nur 32 Bit brauchen und damit insgesamt weniger Platz in der Datenbank belegen.
 
Mit timestamps macht man selten etwas falsch, sie sind vom konzept auch am saubersten: der integer sind die Daten die man speichern will, ein formattiertes Datum ist hingegen eine interpretation oder ansicht der Daten, so empfinde ich das zumindest.