O MySQL vai usar as datas e horas do sistema, caso não seja instruído a proceder de outra maneira. Se você estiver rodando um aplicativo cliente em uma zona com fuso horário diferente do do servidor MySQL, pode alterar manualmente a hora, com a função DATE_ADD().
Linguagens de script, como PHP, Python ou Perl, têm suas próprias funções para ajustar o fuso horário no cliente.
Neste artigo vamos abordar uma técnica manual, que pode ser útil para resolver o problema rapidamente e outras voltadas para quem deseja “resolver e esquecer” — ou seja, usar uma solução definitiva.
O sistema operacional, sobre o qual o servidor MySQL está rodando, afeta os valores usados pelo banco de dados — se seu fuso horário estiver ajustado para SYSTEM. Neste caso, o ajuste pode ser feito no sistema operacional.
Se você substituir o arquivo de sistema de definição de fuso horário, /etc/localtime por outro que tenha regras diferentes, será necessário reiniciar o mysqld para que suas informações sejam atualizadas no servidor MySQL.
Ajuste o fuso horário com DATE_ADD()
Esta pode ser uma forma rápida de obter uma solução — em que basta adicionar ou deduzir a quantidade de horas necessárias para obter o valor de data/hora correto.
Veja como acrescentar 2 horas a todos os horários de uma coluna em uma tabela (CadastroClientes):
SELECTNomeCliente ASCliente,
-> TIME(DataCadastroCliente) AS"Check in time",
-> TIME(DATE_ADD(DataCadastroCliente, INTERVAL +2 HOUR)) AS"Hora local do Check in"
O artigo Como converter horas em segundos minutos e dias aborda a função TIME() e dá outros exemplos de operações aritméticas envolvendo as horas.
Esta abordagem não é a melhor, quando a carga de serviço é grande. Além disso, fazer “trabalho manual e repetitivo” vai contra a nossa cultura hacker.
Veja, nos próximos tópicos, algumas formas de solucionar o problema mais eficientemente.
Ajuste a variável time_zone de fuso horário no MySQL
A variável time_zone pode ser ajustada direto no console do cliente MySQL.
Verifique a sua hora atual com a função NOW(), antes de começar a brincar:
SELECTNOW();
+---------------------+
| NOW() |
+---------------------+
| 2015-07-02 19:37:57 |
+---------------------+
1 row in set (0.01 sec)
Em seguida, altere a variável global de fuso horário e desconecte do servidor:
SET@@global.time_zone = '+3:00';
QUIT
Você precisa sair e entrar de novo na sua sessão MySQL para poder ver os efeitos.
Assim que reiniciar a sessão do MySQL, verifique novamente a hora atual:
SELECTNOW();
+---------------------+
| NOW() |
+---------------------+
| 2015-07-02 22:38:29 |
+---------------------+
1 row in set (0.00 sec)
Se você tiver o banco de dados de nomes de zonas de fusos horários adequadamente configurado, pode se referir às zonas pelos seus nomes. Veja um exemplo:
SETtime_zone='America/Sao_Paulo';
Query OK, 0 rowsaffected (0.01 sec)
SELECT@@time_zone;
+-------------------+
| @@time_zone |
+-------------------+
| America/Sao_Paulo |
+-------------------+
1 row inset(0.00 sec)
Para poder se referir a um nome de zona de fuso horário, como ‘Brazil/DeNoronha’, você precisa estar com o banco de dados de nomes de timezones corretamente configurado. Se você tiver dúvidas sobre este assunto, ou não estiver conseguindo usar os nomes das zonas de fusos, leia este artigo.
Para ver todos os fusos válidos para o Brazil, por exemplo, use a seguinte query:
Você pode selecionar um fuso horário pro servidor MySQL diferente do usado pelo sistema no qual ele se encontra instalado. Para isto, indique o fuso horário desejado, dentro do arquivo /etc/mysql/my.cnf, sob a variável default-time-zone.
Veja um exemplo:
Se você usa Ubuntu ou outra distro GNU/Linux baseada no Debian, pode encontrar uma relação completa de zonas de fusos horários em /usr/share/zoneinfo.
Depois de alterar o arquivo my.cnf, reinicie o servidor MySQL:
sudoservice mysql stop
sudoservice mysql start
mysql start/running, process 11885
Entre novamente no cliente MySQL e verifique o seu novo fuso horário:
NOW();
ou
select@@time_zone;
+------------------+
| @@time_zone |
+------------------+
| Europe/Stockholm |
+------------------+
1 row inset(0.00 sec)
Como você pode perceber, no exemplo acima, alterei o fuso horário para o de Estocolmo (Suécia).
Quando você cansar de brincar, basta remover (ou comentar, com um ‘#’) a referência ao fuso horário no arquivo my.cnf e reiniciar o servidor MySQL — e este voltará a usar o fuso horário do sistema:
## Mais /etc/mysql/my.cnf or C:\ProgramData\MySQL\MySQL Server 5.6\my.ini
- America/Recife
- America/Sao_Paulo — Brazil/East
> default-time-zone=America/Sao_Paulo