2011-01-06 3 views
2

Aus Gründen der Leistung und Einfachheit möchte ich den Inhalt einer DATETIME-Spalte in meinem MySQL 3.x-Server als Sekunden (oder jeden numerischen Typ wirklich - Ich möchte nur die offensichtliche Gemeinheit der Zeitzonen vermeiden, wenn ich UNIX_TIMESTAMP() benutze [die Daten in meiner Tabelle sind in der Tat von verschiedenen Schauplätzen, so dass ich keinen Zweifel haben möchte, ob hinter der Zeitzonenkompensation Verrückheit steckt mein Rücken]).TO_SECONDS() in älteren Versionen von MySQL emulieren (<5.5.0)

Die TO_SECONDS() Funktion schien ideal, bis ich, dass es nur Installationen arbeitet auf neueren herausgefunden, MySQL (Upgrade ist keine Option) ...

ich aber über so etwas wie dies zu tun:

SELECT (TO_DAYS(Timestamp)-730486)*86400+TIME_TO_SEC(Timestamp)

Manuelles Berechnen der Anzahl der Sekunden seit dem 01.01.2001. Aber es scheint, als könnte es den Server unnötig belasten, indem er gezwungen wird, eine temporäre Tabelle oder so etwas zu erstellen?

Ich könnte auch einfach einmal:

SELECT TO_DAYS(Timestamp), TIME_TO_SEC(Timestamp)

und kombinieren Sie die Ergebnisse selbst, aber das macht es weniger einfach auf den Code-Seite.

Was ist der beste Kompromiss? Ich werde eine große Anzahl von Zeilen (in der Größenordnung von 10^6) jede Abfrage abrufen, so dass sowohl die Client-und Server-Seite Leistung ist nicht ganz unwichtig.

Dank ,.

(post editierten Verwirrung zu reduzieren)

Antwort

2

Zunächst nur, um sicherzustellen, das neue Feld wird ein BIGINT ... richtig sein?

Können Sie explizite Umwandlung verwenden, um den Überlauf zu verhindern?

SELECT CAST(TO_DAYS(Timestamp)*86400 + TIME_TO_SEC(Timestamp) AS UNSIGNED INTEGER) 

Oder vielleicht eine Zwischenzeichenfolge verwenden, bevor das neue BIGINT Feld bevölkern?

SELECT CAST(TO_DAYS(Timestamp)*86400 + TIME_TO_SEC(Timestamp) AS UNSIGNED CHAR(11)) 
+0

Neues Feld? Nein, die Daten werden in ein Client-Programm zur weiteren Verarbeitung extrahiert und dem Benutzer angezeigt (es ist ein C/win32-Programm mit ODBC - ich habe diesen Teil gut in der Hand). Re. Ihr Vorschlag, ich erkannte, dass ich nur einen Offset von der 'Tage' Teil subtrahieren kann, um die Werte in einen geeigneten Bereich zu bekommen: SELECT (TO_DAYS (Timestamp) -730486) * 86400 + TIME_TO_SEC (Timestamp). Das ist also kein Problem mehr. Jetzt ist es nur die Frage von, ist das eigentlich eine gute Idee? Ist es nicht "schlecht" in irgendeiner Weise, den Server zu bitten, bei temporären Ergebnissen eine Menge Arithmetik zu machen? – zdaniek

Verwandte Themen