2010-04-22 17 views
11

Ich muss eine vorhandene (datetime Felder) db von lokaler Zeit UTC konvertieren.Mysql: Konvertieren DB von lokaler Zeit in UTC

Die Werte werden auf einem Server mit der Zeitzone CET (+1) (mit Sommerzeit +2) gespeichert. Bei der Auswahl von Daten verwende ich UNIX_TIMESTAMP(), die magisch alles kompensiert, dh Zeitzonenverschiebung und dst (wenn ich die Dokumente richtig gelesen habe).

Ich verschiebe die DB auf einen neuen Server mit UTC als Systemzeit.

Das einfache Subtrahieren von -1 H funktioniert nicht, da die Sommerzeit +2 ist.

Irgendwelche Ideen für einen cleveren Weg, dies zu tun? (mit sql oder einem Skript lang)

Antwort

23

Zuerst müssen Sie sicherstellen, dass die Tabelle mysql.time_zone_name aufgefüllt ist. Wenn es leer ist, können Sie die Anweisungen auf dieser Seite folgen, es zu füllen:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

Es ist in der Regel so einfach wie ein Befehl wie dies in der Shell ausgeführt wird:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

Sobald diese Tabelle ist bevölkerten Sie die CONVERT_TZ() Funktion können Sie die vorhandenen Werte in der DB aktualisieren:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

Hier sind zwei Beispiele zu zeigen, wie es Datetimes von MEZ auf UTC im Winter gegen Sommer wandelt:

mysql> SELECT CONVERT_TZ('2010-01-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-01-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-01-22 11:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT CONVERT_TZ('2010-07-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-07-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-07-22 10:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 
+0

Hallo, ich weiß, dass es eine Weile her ist, dass du geantwortet hast, aber aus irgendeinem Grund funktioniert die select - Anweisung nicht für mich ... Ich habe das Dokument überprüft und kann 'SELECT CONVERT_TZ '(2004-01-01 12 : 00: 00 ',' + 00:00 ',' + 10:00 '); ', aber nicht das, was du oben beschrieben hast ... gibt es etwas, das mir fehlt? Ich bekomme dafür immer null. – KVISH

+3

@kalvish, wahrscheinlich müssen Sie nur die Tabelle mysql.time_zone_name auffüllen. Versuchen Sie, diesen Befehl in der Shell auszuführen, um diese Tabelle zu füllen: mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u Wurzel mysql' –

+0

SELECT CONVERT_TZ ('2017-02-15 08:00:00', "UTC", "CST"); Rückgabe null – wyx

5

Es soll beachtet werden, dass die Umwandlung für Daten von einer Zeitzone in einer anderen oder zu UTC kann nur dann zuverlässig durchgeführt werden, wenn Die Daten liegen in der Vergangenheit.

Zeitzonen-Definitionen ändern sich. Sie sind eine menschliche Definition, wie man von der "Sonnenuhr" abweicht, und diese Definitionen können und werden sich ständig ändern. Die einzige gültige Konvertierung ist für Daten in der Vergangenheit, da sich das nicht mehr ändert.

Jedes Datum in der Zukunft kann nicht zuverlässig konvertiert werden, da die Konvertierung nur die aktuell bekannte Zeitzonendefinition berücksichtigen kann.

Einfaches Beispiel: Lassen Sie uns nächstes Jahr einen Besprechungstermin in Berlin, Deutschland, erstellen. Wir sind uns heute einig, dass wir uns am 01.07.2014 um 12:00 Uhr am Alexanderplatz treffen wollen. Dieses Datum wird an diesem Tag um 10:00 UTC übersetzt.

Jetzt, wenn einige Regierung beschließt, die Sommerzeit 2014 zu deaktivieren, haben Sie ein Problem zu entscheiden, ob Sie um 12:00 Ortszeit oder um 11:00 Uhr Ortszeit angezeigt werden sollten, da die Konvertierung zurück von UTC wird zu einer anderen Ortszeit führen.

Wenn Sie das ursprüngliche Datum "2014-07-01 12:00 Europe/Berlin" gespeichert haben, sind Sie genau wie alle anderen um 12 Uhr mittags dort.

2

In dem ursprünglichen Server, können Sie eine der folgenden Ausdrücke innerhalb einer UPDATE-Abfrage verwenden können:

CONVERT_TZ(your_datetime_field,'SYSTEM','UTC') CONVERT_TZ(your_datetime_field,@@global.time_zone,'UTC')

Alternativ kann in dem Zielserver, wenn Sie die Zeitzone des ursprünglichen Servers kennen (zB 'Europe/Berlin') können Sie eine der folgenden Ausdrücke verwenden:

CONVERT_TZ(your_datetime_field,'Europe/Berlin','UTC') CONVERT_TZ(your_datetime_field,'Europe/Berlin',@@global.time_zone)