2010-04-22 6 views
11

Je dois convertir une base de données existante (datetime fields) à partir de l'heure locale ut UTC.Mysql: Convertir la base de données de l'heure locale en UTC

Les valeurs sont stockées à l'instant sur un serveur avec fuseau horaire CET (+1) (avec heure d'été +2). Lorsque je sélectionne des données, j'utilise UNIX_TIMESTAMP(), ce qui compense magiquement tout, c'est-à-dire le décalage de fuseau horaire et dst (si j'ai lu les docs à droite). Je déplace la base de données vers un nouveau serveur avec UTC comme heure système. Il suffit de soustraire -1 H ne fonctionne pas, car l'heure d'été est +2.

Des idées pour une façon intelligente de faire cela? (en utilisant sql ou un script lang)

Répondre

23

Vous devez d'abord vous assurer que la table mysql.time_zone_name est remplie. Si elle est vide, vous pouvez suivre les instructions de cette page pour le remplir:

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

Il est généralement aussi simple que l'exécution d'une commande comme celui-ci dans la coquille:

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

Une fois que le tableau est peuplé vous pouvez utiliser la fonction CONVERT_TZ() pour mettre à jour les valeurs existantes dans le DB:

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

Voici deux exemples pour montrer comment il convertit datetimes de CET à UTC en hiver vs été:

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

Salut, je sais que ça fait longtemps que tu n'as pas répondu, mais pour une raison ou une autre, cette déclaration ne fonctionne pas pour moi ... J'ai vérifié le document et je suis capable d'obtenir SELECT CONVERT_TZ ('2004-01-01 12 : 00: 00 ',' + 00:00 ',' + 10:00 ');', mais pas ce que vous avez décrit plus haut ... y at-il quelque chose qui me manque? Je continue d'obtenir null pour cela. – KVISH

+3

@kalvish, vous avez probablement juste besoin de remplir la table mysql.time_zone_name. Essayez d'exécuter cette commande dans le shell pour remplir cette table: '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

Il convient de noter que ne peut être effectuée de manière fiable la conversion pour les dates d'un fuseau horaire à un autre ou à UTC si les dates sont dans le passé.

Les définitions de fuseau horaire changent. Ils sont une définition humaine de la façon de s'écarter de «l'horloge solaire», et ces définitions peuvent changer constamment. La seule conversion valide est donc pour les dates passées, car cela ne changera plus.

Toute date dans le futur ne peut pas être convertie de manière fiable, car la conversion ne peut prendre en compte que la définition de fuseau horaire actuellement connue.

Exemple simple: Créons un rendez-vous l'année prochaine à Berlin, en Allemagne. Nous sommes d'accord aujourd'hui que nous voulons nous rencontrer à 12:00 le 1er juillet 2014 à Alexanderplatz. Cette date serait traduite à 10:00 UTC ce jour-là. Si un gouvernement décide de désactiver l'heure d'été en 2014, vous avez un problème pour décider si vous devez vous présenter à 12:00 heure locale, ou à 11:00 heure locale, car la conversion retour à partir de l'UTC entraînera une heure locale différente.

Si vous aviez enregistré la date originale de "2014-07-01 12:00 Europe/Berlin", vous serez là à cette heure exacte à midi, comme tout le monde.

2

Dans le serveur d'origine, vous pouvez utiliser l'une des expressions suivantes dans une requête UPDATE:

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

Alternativement, dans le serveur de destination, si vous connaissez le fuseau horaire du serveur d'origine (par exemple, «Europe/Berlin), vous pouvez utiliser l'une des expressions suivantes:

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

Questions connexes