De forma predeterminada (al menos en las instalaciones basadas en Debian) no se cargan datos de zona horaria en MySQL. Si desea probar si están cargados, intente ejecutar:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Si devuelve un DATETIME
(en este caso 2012-06-07 08:00:00
), tiene zonas horarias cargadas. Si devuelve NULL
, no lo son. Cuando no está cargado, está limitado a convertir usando compensaciones (por ejemplo, +10:00
o -6:00
).
Esto debería funcionar bien en muchos casos, pero hay ocasiones en las que es mejor usar zonas horarias con nombre, como para no preocuparse por el horario de verano. Al ejecutar el siguiente comando, se cargan los datos de la zona horaria del sistema (solo para Unix. No estoy seguro de cuál sería el comando equivalente de Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Si necesita confiar continuamente en las zonas horarias de MySQL, el comando anterior debe ejecutarse cada vez que se actualice la zona horaria del sistema . También puede simplemente agregarlo a un trabajo cron semanal o mensual para que lo haga automáticamente.
Luego, para ver una lista de zonas horarias, simplemente haga lo siguiente:
USE mysql;
SELECT * FROM `time_zone_name`;
Tenga en cuenta que la información de la zona horaria ocupa unos 5 MB en MySQL. Si alguna vez desea descargar la información de la zona horaria, simplemente ejecute lo siguiente y reinicie MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
No DROP
estas mesas o sucederán cosas malas.
Editar:
Según el comentario de un usuario a continuación, si desea que las zonas horarias se actualicen automáticamente cuando actualice el sistema, primero debe permitir que la raíz inicie sesión sin que se le solicite una contraseña.
MySQL>=5.6.6
Ejecute la siguiente [fuente ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Crea un ~/.my.cnf
archivo (si aún no existe) y agregue lo siguiente:
[client]
user=root
password=yourMysqlRootPW
Luego ejecute chmod 600 ~/.my.cnf
para asegurarse de que nadie más pueda leerlo.
Actualizar secuencia de comandos
Agregue el siguiente script a crontab para que se ejecute una vez al día:
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
Eliminar el echo
líneas si no desea ninguna salida.
Nota:Esto es (en su mayoría) no probado. Avísame si tienes algún problema y actualizaré esta respuesta.