Mysql: Convertir DB de l'heure locale à l'heure UTC
J'ai besoin de convertir un existant (les champs datetime) db à partir de l'heure locale ut UTC.
Les valeurs sont stockées ad datetimes sur un serveur avec de fuseau horaire, heure locale (+1) (été +2). Lors de la sélection des données j'utilise UNIX_TIMESTAMP()
qui comme par magie compense tout, c'est à dire, le temps de fuseau horaire et de l'heure d'été (si j'ai lu les docs à droite).
Je me déplace à la db pour un nouveau serveur avec UTC heure système.
Simplement en soustrayant -1 H ne fonctionne pas, que l'heure d'été est de +2.
Des idées pour un savant façon de le faire? (à l'aide de sql ou un script lang)
source d'informationauteur Joernsn
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord assurez-vous que la base de données mysql.time_zone_name table est remplie. Si elle est vide, vous pouvez suivre les instructions sur 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 de cette commande dans le shell:
Une fois que le tableau est rempli, vous pouvez utiliser le CONVERT_TZ fonction() pour mettre à jour les valeurs existantes dans la base de données:
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 HEC à l'UTC en hiver vs été:
Il convient de noter que la conversion pour les dates à partir d'un fuseau horaire à un autre ou à l'UTC ne peut être fait que de manière fiable si les dates sont dans le passé.
Fuseau horaire définitions de changement. Ils sont une définition humaine de façon à s'écarter du "soleil de l'horloge", et ces définitions peuvent changer constamment. Donc, la seule valable conversion des dates dans le passé, parce que cela ne changera pas plus.
Une date quelconque dans l'avenir fiable ne peut pas être convertis, parce que la conversion ne peut prendre en compte actuellement connus fuseau horaire définition.
Exemple Simple: nous allons créer un rendez-vous de réunion de l'année prochaine à Berlin, en Allemagne. Nous sommes d'accord aujourd'hui que nous voulons rencontrer à 12:00 le 1er juillet 2014, sur l'Alexanderplatz. Cette date doit être traduit à 10:00 UTC ce jour-là.
Maintenant, si le gouvernement décide de retirer de l'heure d'été en 2014, vous auriez un problème de décider si vous devriez montrer jusqu'à 12:00, heure locale, ou à 11:00 heure locale, parce que la conversion de l'UTC va se traduire par une, heure locale.
Si vous avait sauvé la date originale de "2014-07-01 12:00 Europe/Berlin", vous y serez à l'heure exacte à midi, comme tout le monde.
Dans le serveur d'origine, vous pouvez utiliser l'une des expressions suivantes à l'intérieur d'une requête de mise à JOUR:
CONVERT_TZ(your_datetime_field,'SYSTEM','UTC')
CONVERT_TZ(your_datetime_field,@@global.time_zone,'UTC')
Sinon, 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)