Como comportamento padrão, o MySQL vai usar as datas e horas do sistema, caso não seja instruído a proceder de outra maneira.
Se 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):
[sql gutter="false"]SELECT NomeCliente AS Cliente,
-> TIME(DataCadastroCliente) AS "Check in time",
-> TIME(DATE_ADD(DataCadastroCliente, INTERVAL +2 HOUR)) AS "Hora local do Check in"
-> FROM CadastroClientes LIMIT 10;[/sql]
+--------------------+---------------+------------------------+
| Cliente | Check in time | Hora local do Check in |
+--------------------+---------------+------------------------+
| Christen Wiggins | 10:03:39 | 12:03:39 |
| Justine Howard | 21:44:49 | 23:44:49 |
| Brenda Ellis | 11:58:30 | 13:58:30 |
| Hayfa Mendoza | 20:52:29 | 22:52:29 |
| Kylie Mckay | 09:43:57 | 11:43:57 |
| Fredericka Fuller | 15:33:51 | 17:33:51 |
| Gretchen Bartlett | 17:02:54 | 19:02:54 |
| Fiona Chen | 20:28:20 | 22:28:20 |
| Lacy Holland | 02:00:29 | 04:00:29 |
| Karleigh Contreras | 01:06:55 | 03:06:55 |
+--------------------+---------------+------------------------+
10 rows in set (0.00 sec)
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.
- Como pré-determinar o tempo de uso das sessões no Bash.
- Como instalar suporte a MariaDB no Python
- Dell XPS 13 é o melhor laptop para programadores Linux?
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:
SELECT NOW();
+---------------------+
| 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:
SELECT NOW();
+---------------------+
| 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:
SET time_zone='America/Sao_Paulo';
Query OK, 0 rows affected (0.01 sec)
SELECT @@time_zone;
+-------------------+
| @@time_zone |
+-------------------+
| America/Sao_Paulo |
+-------------------+
1 row in set (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:
SELECT * FROM mysql.time_zone_name WHERE Name LIKE '%Brazil%';
+------------------------+--------------+
| Name | Time_zone_id |
+------------------------+--------------+
| Brazil/Acre | 360 |
| Brazil/DeNoronha | 361 |
| Brazil/East | 362 |
| Brazil/West | 363 |
| posix/Brazil/Acre | 957 |
| posix/Brazil/DeNoronha | 958 |
| posix/Brazil/East | 959 |
| posix/Brazil/West | 960 |
| right/Brazil/Acre | 1554 |
| right/Brazil/DeNoronha | 1555 |
| right/Brazil/East | 1556 |
| right/Brazil/West | 1557 |
+------------------------+--------------+
12 rows in set (0.00 sec)
Ajuste o arquivo de configuração my.cnf
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:
[bash gutter="false"][mysqld]
default-time-zone = Europe/Lisbon[/bash]
Para que o comando acima funcione adequadamente, é necessário que as tabelas de timezones estejam completas e preenchidas.
Há outros valores, para quem se encontra em país de língua portuguesa:
- Africa/Luanda
- America/Campo_Grande
- America/Bahia
- America/Belem
- America/Boa_Vista
- America/Cuiaba
- America/Fortaleza
- America/Manaus — Brazil/West
- America/Noronha — Brazil/DeNoronha
- America/Porto_Acre — Brazil/Acre
- America/Porto_Velho
- America/Recife
- America/Rio_Branco — Brazil/Rio_Branco
- America/Santarem
- America/Sao_Paulo — Brazil/East
- Brazil/Acre
- Brazil/DeNoronha
- Brazil/East
- Brazil/Rio_Branco
- Brazil/West
- Athlantic/Cape_Verde
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:
sudo service mysql stop
sudo service 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 in set (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:
select @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| SYSTEM |
+-------------+
Se você quiser entender melhor o uso do arquivo de configuração my.cnf
, leia o artigo Use um arquivo de configuração pessoal para se conectar ao MySQL.
- Você precisa conhecer este pacman para crianças
- Jogue Space Invaders no Linux
- Jogue Pacman clássico no Linux
- O jogo da cobrinha no terminal
- Obtenha informações dos seus sistemas de arquivos com o lsblk
Referências:
https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
http://stackoverflow.com/questions/930900/how-to-set-time-zone-of-mysql
4 replies on “Como ajustar o fuso horário ou timezone no MySQL”
[…] The time_zone variable can be set right in the MySQL client console. Check your current time with the NOW() function, before you start playing: […]
Vale pela ajuda 06/12/2019 me salvou!
Obrigada, resolveu meu problema
Vlw, me ajudou aqui com a dica do cnf.