2010-03-26 22 views
32

Saludos a todos (de un principiante MySQL)MySQL CONVERT_TZ()

Estoy tratando de establecer una base de datos que almacena los tiempos de alerta diarios según lo especificado por los usuarios. Por ejemplo, el usuario desea recibir una alerta si se cumple algún criterio cada día entre las 7:00 a.m. y las 7:30 a.m. Al tratar de implementar esto, necesito acomodar el horario de verano. Aquí está mi intento de solución:

  1. almacenar a los usuarios de zona horaria local (en formato largo, por ejemplo, "los Estados Unidos/Oriental") la información en una tabla (por ejemplo userInfo), y los tiempos de alarma en otra tabla (decir userAlarms).
  2. Al consultar la tabla userAlarms, convierta la hora UTC en la hora local de los usuarios según lo especificado por la columna tz almacenada en la tabla userInfo a través del CONVERT_TZ(UTC_TIME(), 'UTC', userInfo.tz).

Pregunta 1. Desde mi entender, especificando el nombre de zona horaria (como los EEUU/Madrid) debe tomar en cuenta el ahorro de tiempo la luz del día. Por ejemplo, llamar al CONVERT_TZ('00:00:00', 'UTC', 'US/EASTERN') el 1 de enero debería dar '19: 00: 00 ', pero el 1 de julio la llamada debería dar '20: 00: 00'. ¿Estoy en lo correcto?

Pregunta 2. Si Q1 es correcto, ¿debo actualizar constantemente la tabla de zona horaria de MySQL para mantener actualizadas las compensaciones de UTC de la zona horaria?

Pregunta 3. La muestra proporcionada en la documentación de MySQL SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') produce "NULL" cuando se ejecuta en mi servidor. ¿Podría ser causado por no tener las tablas de zona horaria configuradas? ¿Cómo puedo verificar esto?

Respuesta

17

Q1: Sí, el CONVERT_TZ tiene en cuenta el horario de verano para usted. Esta información y la hora en que DST comienza/finaliza para cada zona horaria se almacena en las tablas time_zone_ *.

Q2: Sí, como se indica en los documentos de mysql, la información de la zona horaria cambia según la política de cada área. Deberá actualizar las tablas time_zone_ * cada vez que ocurra un cambio. Apesta ser TI a veces, este es uno de ellos.

P3: Estas son las 5 mesas de husos horarios, consultar con ellos para ver si tienen algo en ellos:

select * from mysql.time_zone_transition_type; 
select * from mysql.time_zone_transition; 
select * from mysql.time_zone_name; 
select * from mysql.time_zone_leap_second; 
select * from mysql.time_zone; 
+1

Me está dando 'Error 1046 (3d000): No hay base de datos seleccionada' –

+1

Es necesario para canalizar la salida a, literalmente, 'mysql -uroot mysql' - mysql es el ejecutable binario, y el segundo es el nombre de la base de datos mysql. – philwinkle

+0

o 'use mysql;' primero para usar este DB en todos los comandos. O directamente: 'SELECT * FROM mysql.time_zone;' – Razor

20

yo encontramos este hilo útiles y decidieron compartir la página doc para la importación de esta información. Hice exactamente como se indica a continuación en CentOS y en RHEL y funcionó a la perfección. Ahora puedo usar la función CONVERT_TZ con argumentos como "GMT" y "US/Eastern".

De la documentación de MySQL esta es la forma de importar la información de MySQL tabla de zonas horarias:

http://dev.mysql.com/tech-resources/articles/4.1/time.html


Para todos los usuarios que usan MySQL 4.1.3 o posterior en un sistema basado en Unix (recuérdese esto no funciona en los sistemas Windows todavía):

Complete las tablas de la zona horaria.

Para hacerlo, ejecute el programa mysql_tzinfo_to_sql, provisto con la distribución MySQL. mysql_tzinfo_to_sql lee los archivos de zona horaria del sistema operativo y genera declaraciones SQL de ellos. Las declaraciones SQL luego son procesadas por mysql, para cargar las tablas de zonas horarias.

Para ejecutar mysql_tzinfo_to_sql con éxito, es necesario saber dónde se almacenan los archivos de zona horaria del sistema operativo de la máquina del servidor; busque un directorio con un nombre similar al /usr/share/zoneinfo. Pase el nombre del directorio en la línea de comando al mysql_tzinfo_to_sql y envíe la salida al programa mysql. Aquí hay un ejemplo.

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

Nota: El comando anterior supone que "mysql_tzinfo_to_sql" y "mysql" están en su camino. Si no es así, tendrá que proporcionar la ruta completa a la vez cuando se ejecuta el comando, o cambiar a la carpeta bin de MySQL y utilizar un comando de esta forma:

shell> ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql 
+0

Necesitaba reiniciar el daemon MySQL antes de que entrara en vigor (en Debian). – Ekster

24

Si esto produce nula entonces el TZ las tablas no se han establecido:

SELECT CONVERT_TZ(now(),'US/Eastern','US/Central'); 

Si usted no tiene las tablas de zona horaria establecieron que podría actualizar la hora desplazamiento en la tabla de usuario y luego hacer:

select utc_timezone() - interval user_timezone_offset_in_hours hour 
from userinfo a 
where user_id = 999; 

Yo Sin embargo, todavía necesitarías una forma de actualizar la zona horaria del usuario.

Si está escribiendo esto para una aplicación web, puede obtener la zona horaria a través de javascript, aquí hay un article que describe cómo (no lo he intentado pero parece que funcionará).

Un poco de una explicación con respecto a 'intervalo' arriba ...

Uno de los más construcciones de truco en MySQL es el uso de la INTERVAL palabra clave, se muestra mejor por ejemplo el (valor numérico puede ser una expresión o el valor del campo)

select now() today, now() - interval 1 day yesterday; 
+---------------------+---------------------+ 
| today    | yesterday   | 
+---------------------+---------------------+ 
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 | 
+---------------------+---------------------+ 

se pueden añadir y restar de todos modos que te gusta, es por eso que nunca molesto con la fecha/hora de añadir/restar/convierto funciones

select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b; 
+---------------------+---------------------+ 
| a     | b     | 
+---------------------+---------------------+ 
| 2011-05-26 13:24:16 | 2011-05-25 17:32:16 | 
+---------------------+---------------------+ 

Puede utilizar números negativos (debe ser bueno para las compensaciones de zona horaria negativos) estos son los mismos:

select now() - interval 1 month a, now() + interval -1 month b; 
+---------------------+---------------------+ 
| a     | b     | 
+---------------------+---------------------+ 
| 2011-04-26 13:38:05 | 2011-04-26 13:38:05 | 
+---------------------+---------------------+ 
+0

¡Muchas gracias! es muy útil ~ – Scarlett

+0

¡buena respuesta! interval + convert_tz rocks! –

+0

¿Qué es 'user_timezone_offset_in_hours'? –