2010-04-22 14 views
11

Potrzebuję konwertować istniejącą (pola datetime) db z czasu lokalnego ut UTC.Mysql: Konwertuj DB z czasu lokalnego na UTC

Wartości są przechowywane w postaci dat reklamowych na serwerze ze strefą czasową CET (+1) (z latem +2). Podczas wybierania danych używam UNIX_TIMESTAMP(), który w magiczny sposób kompensuje wszystko, tj. Przesunięcie strefy czasowej i dst (jeśli przeczytałem dokumentację w prawo).

Przenoszę db do nowego serwera z UTC jako czas systemowy.

Po prostu odjęcie -1 H nie zadziała, ponieważ czas letni wynosi +2.

Wszelkie pomysły na sprytny sposób to zrobić? (używając sql lub jakiegoś skryptu języka)

Odpowiedz

23

Najpierw musisz się upewnić, że tablica mysql.time_zone_name jest wypełniona. Jeśli jest pusty, można postępować zgodnie z instrukcjami na tej stronie, aby ją wypełnić:

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

To zazwyczaj tak proste jak uruchomienie polecenia jak to w powłoce:

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

Raz, że tabela jest zaludnionych można użyć funkcji CONVERT_TZ(), aby zaktualizować istniejące wartości w DB:

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

Oto dwa przykłady, które pokazują, w jaki sposób przetwarza datetimes z CET UTC zimą vs latem:

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

Witam, wiem, że minęło trochę czasu, odkąd odpowiedziałeś, ale z jakiegoś powodu ta instrukcja nie działa dla mnie ... Sprawdziłem dokument i mogę uzyskać "SELECT CONVERT_TZ" ("2004-01-01 12 : 00: 00 ',' + 00:00 ',' + 10:00 '); ', ale nie to, co opisałeś powyżej ... jest coś, czego mi brakuje? Wciąż za to otrzymuję zero. – KVISH

+3

@kalvish, prawdopodobnie wystarczy wypełnić tabelę mysql.time_zone_name. Spróbuj uruchomić to polecenie w powłoce, aby wypełnić tę tabelę: 'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql' –

+0

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

5

Należy zauważyć, że konwersja na terminach z jednej strefy czasowej do innego lub do UTC można zrobić tylko niezawodnie jeśli daty są w przeszłości.

Zmiana definicji stref czasowych. Są ludzką definicją tego, jak odstąpić od "zegara słonecznego", a te definicje mogą i zmieniają się nieustannie. Tak więc jedyna ważna konwersja dotyczy dat w przeszłości, ponieważ to się już nie zmieni.

Dowolna data w przyszłości nie może zostać niezawodnie przekonwertowana, ponieważ konwersja może uwzględniać tylko obecnie znaną definicję strefy czasowej.

Prosty przykład: Załóżmy spotkanie w przyszłym roku w Berlinie w Niemczech. Zgadzamy się dzisiaj, że chcemy się spotkać o godzinie 1 lipca 2014 r. Na Alexanderplatz. Ta data zostanie przetłumaczona na 10:00 czasu UTC w tym dniu.

Teraz, jeśli jakiś rząd zdecyduje się zrezygnować z czasu letniego w 2014 r., Będziesz miał problem z podjęciem decyzji, czy powinieneś pojawić się o 12:00 czasu lokalnego, czy o 11:00 czasu lokalnego, ponieważ konwersja z powrotem z UTC spowoduje inny czas lokalny.

Jeśli zapisałeś oryginalną datę "2014-07-01 12:00 Europa/Berlin", będziesz tam o tej samej godzinie w południe, tak jak wszyscy inni.

2

W oryginalnym serwerze, można użyć jednego z następujących wyrażeń wewnątrz kwerendy UPDATE:

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

Alternatywnie, w serwerze docelowym, jeśli wiesz, strefę czasową oryginalnego serwera (na przykład 'Europe/Berlin') można użyć jednego z następujących wyrażeń:

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

Powiązane problemy