2010-04-22 15 views
11

Necesito convertir un db existente (campos de fecha y hora) de la hora local ut UTC.Mysql: Convertir la base de datos de la hora local a UTC

Los valores se almacenan ad datetimes en un servidor con zona horaria CET (+1) (con horario de verano +2). Al seleccionar datos, uso UNIX_TIMESTAMP(), que mágicamente compensa todo, es decir, cambio de zona horaria y dst (si he leído bien los documentos).

Moveré el db a un nuevo servidor con UTC como hora del sistema.

Simplemente restar -1 H no funcionará, ya que el horario de verano es +2.

¿Alguna idea de una forma inteligente de hacerlo? (usando sql o algún script lang)

Respuesta

23

Primero debe asegurarse de que la tabla mysql.time_zone_name esté llena. Si está vacío, puede seguir las instrucciones de esta página para poblarlo:

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

Es generalmente tan simple como ejecutar un comando como este en el shell:

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

Una vez que la tabla es pobladas puede utilizar la función CONVERT_TZ() para actualizar los valores existentes en el PP:

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

Aquí hay dos ejemplos para mostrar cómo se convierte datetimes del CET a UTC en invierno vs verano:

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

Hola, sé que ha pasado un tiempo desde que respondiste, pero por alguna razón esa declaración seleccionada no funciona para mí ... Revisé el documento y puedo obtener 'SELECT CONVERT_TZ ('2004-01-01 12 : 00: 00 ',' + 00:00 ',' + 10:00 '); ', pero no lo que describiste arriba ... ¿hay algo que me falta? Sigo obteniendo nulo por eso. – KVISH

+3

@kalvish, es probable que solo tengas que completar la tabla mysql.time_zone_name. Intente ejecutar este comando en el shell para completar esa tabla: 'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql' –

+0

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

5

Cabe señalar que la conversión de fechas de una zona horaria a otra oa UTC sólo puede hacerse de forma fiable si las fechas están en el pasado.

Las definiciones de zona horaria cambian. Son una definición humana de cómo desviarse del "reloj solar", y esas definiciones pueden cambiar constantemente. Entonces, la única conversión válida es para fechas pasadas, porque eso ya no cambiará.

Cualquier fecha en el futuro no se puede convertir de manera confiable, porque la conversión solo puede tener en cuenta la definición de zona horaria actualmente conocida.

Ejemplo simple: Vamos a crear una cita para la reunión el próximo año en Berlín, Alemania. Hoy acordamos que queremos reunirnos a las 12:00 del 1 de julio de 2014 en Alexanderplatz. Esa fecha se traduciría a las 10:00 UTC de ese día.

Ahora, si algún gobierno decide optar por el horario de verano en 2014, tendrá un problema para decidir si debe presentarse a las 12:00 hora local, oa las 11:00 hora local, porque la conversión vuelve de UTC dará como resultado una hora local diferente.

Si hubiera guardado la fecha original de "2014-07-01 12:00 Europe/Berlin", estará allí a esa hora exacta al mediodía, como todos los demás.

2

En el servidor original, puede utilizar una de las siguientes expresiones en el interior de una consulta UPDATE:

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

Por otra parte, en el servidor de destino, si se conoce la zona horaria del servidor original (por ejemplo, 'Europe/Berlin'), puede utilizar una de las siguientes expresiones:

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

Cuestiones relacionadas