2010-02-02 28 views
24

Puede MySQL convertir una hora UTC almacenado a timezon locales: tiempo ed directamente en una instrucción de selección normal?¿Puede MySQL convertir una hora UTC almacenada a la zona horaria local?

Digamos que usted tiene algunos datos con una marca de tiempo (UTC).

CREATE TABLE `SomeDateTable` (
    `id` int(11) NOT NULL auto_increment, 
    `value` float NOT NULL default '0', 
    `date` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 

Luego, cuando me

"select value, date from SomeDateTable"; 

que, por supuesto, conseguir todas las fechas como en su forma UTC almacenado.

Pero digamos que me gustaría tenerlos en otra zona horaria (con horario de verano), ¿Puedo agregar algo de magia a la consulta de selección para que obtenga todas las fechas en la zona horaria seleccionada?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable"; 

O debo hacer esto de alguna otra capa en la parte superior, como en algún código php? (parece ser que la mayoría de las personas han resuelto este problema).

Gracias Johan


Si la instalación de MySQL le permite utilizar CONVERT_TZ se trata de una solución muy limpia, este ejemplo muestra cómo usarlo.

SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

Sin embargo no sé si esto es una buena manera, ya que algunos de instalación de MySQL no se encuentra esta función, utilizar con cuidado.

Respuesta

1

no estoy seguro de lo que se puede hacer matemáticas en un tipo de datos DATETIME, pero si usted está usando PHP, recomiendo encarecidamente el uso de las marcas de tiempo basados ​​en enteros. Básicamente, puede almacenar un entero de 4 bytes en la base de datos utilizando la función de tiempo() de PHP. Esto hace que las matemáticas sean mucho más sencillas.

+0

El CONVERT_TZ era la respuesta a mi pregunta, pero tal vez voy a utilizar PHP para esto de todos modos ...ya que el servidor donde alojo mi sitio también estaba perdiendo esos datos de zona horaria (y no puedo arreglarlo ...) – Johan

3

propongo utilizar

SET time_zone = 'proper timezone'; 

está haciendo una vez justo después de conectarse a la base de datos. y después de esto, todas las marcas de tiempo se convertirán automáticamente al seleccionarlas.

+10

Es importante tener en cuenta que esto no convertirá automáticamente los campos FECHA, HORA, y DATETIME. Esto solo hará conversiones automáticas para los campos TIMESTAMP y afectará los resultados de las funciones NOW() y CURDATE(). – Tom

+0

Si desea que esto sea permanente, también puede cambiar el parámetro time_zone. – jamsandwich

12

Para aquellos que no pueden configurar el entorno mysql (por ejemplo, debido a la falta de acceso SUPER) para usar nombres de zona horaria amigables como "America/Denver" o "GMT" también puede usar la función con compensaciones numéricas como esta:

CONVERT_TZ(date,'+00:00','-07:00')

+4

Eso no funcionará si esa zona horaria tiene horario de verano (http://www.timeanddate.com/time/dst/), ya que tendrá diferente offset sommer e invierno, y también hay algunos ejemplos con 30min DST ... – Johan

+0

interesante ... en mi caso tengo que ejecutar algunas consultas de PHP y no quiero hacer ningún manejo de TZ con los resultados en PHP, pero podría modificar fácilmente el valor numérico en la consulta de selección. Gracias – tmsimont

4

select convert_tz(now(),@@session.time_zone,'+03:00')

para obtener la hora sólo utilizan tiempo (CONVERT_TZ (ahora(), @@ session.time_zone, '+ 3:00'))

Cuestiones relacionadas