sql >> Base de Datos >  >> RDS >> Mysql

Zonas horarias de MySQL

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.