2010-02-02 8 views
24

Kann MySQL eine gespeicherte UTC-Zeit in lokale Zeitzone konvertieren: Zeit direkt in einer normalen Select-Anweisung?Kann MySQL eine gespeicherte UTC-Zeit in eine lokale Zeitzone umwandeln?

Nehmen wir an, Sie haben einige Daten mit einem Zeitstempel (UTC).

CREATE TABLE `SomeDateTable` (
    `id` int(11) NOT NULL auto_increment, 
    `value` float NOT NULL default '0', 
    `date` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 

Dann, wenn ich

"select value, date from SomeDateTable"; 

ich natürlich bekommen alle Termine als in ihrer gespeicherten UTC Form.

Aber sagen wir, dass ich sie in einer anderen Zeitzone haben möchte (mit DST), kann ich dann etwas hinzufügen, um alle Daten in der ausgewählten Zeitzone zurück zu bekommen?

Oder muss ich das in einer anderen Schicht oben tun, wie in einigen PHP-Code? (es scheint so zu sein, wie die meisten Leute dieses Problem gelöst haben).

Dank Johan


Wenn Ihre MySQL-Installation können Sie CONVERT_TZ es ist eine sehr saubere Lösung, dieses Beispiel zeigt, wie es zu benutzen.

SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

Allerdings weiß ich nicht, ob dies ein guter Weg ist, da einige MySQL-Installation diese Funktion fehlt, verwenden Sie vorsichtig.

Antwort

1

Ich bin nicht sicher, welche Mathematik kann auf Datumsdatentyp durchgeführt werden, aber wenn Sie PHP verwenden, empfehle ich die Integer-basierten Zeitstempel verwendet wird. Im Grunde können Sie eine 4-Byte-Ganzzahl in der Datenbank speichern, indem Sie die time() - Funktion von PHP verwenden. Das macht Mathe viel einfacher.

+0

Der convert_tz war die Antwort auf meine Frage, aber vielleicht werde ich dafür trotzdem php verwenden ...Da der Server, auf dem ich meine Site hostet, auch diese Zeitzonendaten nicht enthält (und dort kann ich ihn nicht beheben ...) – Johan

3

Ich schlage vor,

SET time_zone = 'proper timezone'; 

einmal zu verwenden, direkt nach der Verbindung zur Datenbank getan. und danach werden alle Zeitstempel automatisch konvertiert, wenn sie ausgewählt werden.

+10

Wichtig zu beachten, dass dies die Felder DATUM, ZEIT und DATETIME nicht automatisch konvertiert. Dies führt nur zu automatischen Konvertierungen für TIMESTAMP-Felder und wirkt sich auf die Ergebnisse der NOW() - und CURDATE() - Funktionen aus. – Tom

+0

Wenn dies dauerhaft sein soll, können Sie auch den Parameter time_zone ändern. – jamsandwich

12

Für diejenigen, die die mysql-Umgebung nicht konfigurieren können (zB wegen fehlendem SUPER-Zugriff), um benutzerfreundliche Zeitzonennamen wie "America/Denver" oder "GMT" zu verwenden, können Sie die Funktion auch mit numerischen Offsets wie folgt verwenden:

CONVERT_TZ(date,'+00:00','-07:00')

+4

Das funktioniert nicht, wenn diese Zeitzone Sommerzeit hat (http://www.timeanddate.com/time/dst/), da Sie im Sommer und Winter einen anderen Offset haben, und es gibt auch einige Beispiele mit 30min DST ... – Johan

+0

interessant .. in meinem Fall muss ich ein paar Abfragen von PHP ausführen und möchte keine TZ-Behandlung mit den Ergebnissen in PHP tun, aber ich könnte leicht den numerischen Wert in der Select-Abfrage ändern. Vielen Dank – tmsimont

4

select convert_tz(now(),@@session.time_zone,'+03:00')

Für die Zeit nur Zeit (CONVERT_TZ (now(), @@ session.time_zone, '+ 03.00')) verwenden, erhalten

Verwandte Themen