convert_tz retorna nulo

92

Eu sei que isso parece estúpido, mas quando eu uso

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time

ele produz NULL. Estou usando o MySQL Workbench no Ubuntu 12.04 de 64 bits e funciona em meu outro laptop / sistema operacional (também usando o MySQL Workbench).

Mohur
fonte

Respostas:

173

Isso acontecerá se você não carregou a tabela de fuso horário no mysql.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Barmar
fonte
1
Você só precisa fazer isso uma vez ou toda vez que o MySql iniciar?
Abe Miessler
3
Só uma vez. Ele carrega as informações em uma tabela no MySQL, que é usado a partir de então.
Barmar de
2
Você também pode usar o sinalizador de força para substituir quaisquer erros que encontrar: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
scum
3
Eu precisava reiniciar o daemon do MySQL também antes que ele entrasse em vigor (no Debian).
Ekster
2
Olá, quando executo este comando, recebo um erro como este: Aviso: Não foi possível carregar '/usr/share/zoneinfo/iso3166.tab' como fuso horário. Ignorando. Aviso: Não foi possível carregar '/usr/share/zoneinfo/zone.tab' como fuso horário. Ignorando.
Ghanshyam Katriya
26

Eu encontrei este tópico depois de passar algum tempo tentando descobrir por que, após executar o comando na resposta aceita (que é a mesma no site dev do MySQL), o comando não conseguiu converter entre fusos horários como

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','MET') AS time

Acontece que no OS X existem dois arquivos que causam problemas: /usr/share/zoneinfo/Factorye /usr/share/zoneinfo/+VERSION.

A correção ... mover temporariamente esses arquivos para um local diferente, como /usr/share/zoneinfo/.bak/permite o comando

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

para preencher totalmente todas as informações de fuso horário esperadas.

Isso pode ou não ser um bug em minha versão instalada do MySQL:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.11, for osx10.6 (x86_64) using  EditLine wrapper

Também estou operando em STRICT_MODE.

Em qualquer caso, espero que isso evite algumas dores de cabeça para quem está procurando a solução.

Jim Schubert
fonte
13

Além do ambiente Windows, você pode definir o fuso horário por

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Em ambiente Windows ,

1. download Time zone description tables from http://dev.mysql.com/downloads/timezones.html

2. Stop MySQL server

3. Put then inside Mysql installation package (ou seja, C: \ Arquivos de programas \ MySQL \ data \ mysql) `

4. Start MySQL server

..Seu trabalho acabou ..

Se ainda assim você está recebendo NULLpara CONVERT_TZ download dessas tabelas de banco de dados e inseri-lo no banco de dados mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

Agora seu problema será resolvido .. :)

Rakesh
fonte
2

Se você estiver usando o MySql no Windows, terá que carregar os dados de fuso horário no esquema mysql. Aqui está um bom COMO FAZER: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

Se você não fizer isso, a função CONVERT_TZ não reconhecerá seu fuso horário de entrada (ou seja, seus exemplos: 'UTC', 'Ásia / Jacarta') e simplesmente retornará NULL.

Domenic D.
fonte
2

MAMP PRO

  1. Abrir Terminal
  2. cd /usr/share/zoneinfo/
  3. sudo mv +VERSION ~/Desktop
  4. cd /applications/MAMP/Library/bin
  5. sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
  6. sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/
Jaseem Abbas
fonte
Além da localização da pasta binária, isso se aplica ao macOS em geral. Obrigado!
coronelclick
2

1) No Windows, não há nenhuma pasta de dados agora C:\Program Files\MySQL\como nas outras respostas.

2) Nesse caso, procure C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Geralmente esta pasta está oculta e você não verá C:\ProgramData\algumas vezes.

3) Altere as configurações na guia Exibir para ver os arquivos e pastas ocultos, conforme explicado aqui https://irch.info/index.php?pg=kb.page&id=133

4) Pare o serviço MySQL procurando por "serviços" no botão Iniciar do Windows.

5) Em seguida, descompacte timezone_2017c_posix.zip e copie os arquivos nele (copie os arquivos diretamente, não copie a pasta inteira) e cole C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) Para MySQL 5.7, timezone_2017c_posix.zip fornecerá apenas um arquivo .sql após descompactar e pode não resolver o problema. Então vá em frente e baixe o arquivo zip para 5.6, mesmo se você estiver executando o MySQL 5.7 e copie esses arquivos paraC:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7) Reinicie o servidor MySQL. Para verificar se CONVERT_TZ () está funcionando, execute esta consulta sql.

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); e verifique se há saída não nula.

Shanu
fonte
1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

se você receber o erro data too long for column 'abbreviation' at row 1 , consulte: https://bugs.mysql.com/bug.php?id=68861

a correção seria executar o seguinte

isso adicionará uma linha para desativar o modo mysql e permitir que o mysql insira dados truncados devido a um bug do mysql onde o mysql adicionaria um caractere nulo no final (de acordo com o link acima)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql

echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql

mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
Timo Huovinen
fonte
Eu tenho OSX El Capitan e esta é a única resposta para fazê-lo funcionar. Para referência futura: no meu caso, o erro afirma: "Dados muito longos para a coluna 'Abreviação' na linha 1". Nota: todos os esforços para fazer (sudo) mkdir ou (sudo) mv dos arquivos mencionados em outras respostas resultam em 'Permissão negada'
hepabolu
BTW, não precisei reiniciar o MySQL.
hepabolu
1

Estas são as etapas para que funcione se você estiver no Windows e usando o MySQL 5.7.

  1. Clique com o botão direito em Meu Computador / Computador / Este PC ou qualquer que seja o nome do seu sistema operacional e escolha Propriedades.
  2. Escolha "Configurações avançadas do sistema" no painel esquerdo.
  3. Escolha "Variáveis ​​ambientais", digite o nome do caminho completo do diretório bin do MySQL (geralmente será em C: \ Arquivos de programas \ MySQL \ MySQL Server 5.7 \ bin).
  4. Abra o prompt cmd, entre no mysql usando mysql -u root -p password.
  5. Entre use mysqlpara selecionar o banco de dados MySQL.
  6. Baixe o arquivo "timezone_YYYYc_posix_sql.zip" (no lugar de YYYY, substitua o ano máximo disponível nessa página como 2017 ou 2018) em https://dev.mysql.com/downloads/timezones.html .
  7. Extraia e abra o arquivo no editor de texto.
  8. Copie o conteúdo e execute no prompt do cmd.

Após a conclusão bem-sucedida, você poderá usar CONVERT_TZoutras funções de fuso horário.

Desconhecido
fonte
0

No Mac OS Catalina ao usar XAMPP,

Vá para a pasta / Applications / XAMPP / xamppfiles / bin no Terminal e execute o seguinte.

./mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e "s / Fuso horário local deve ser definido - consulte a página de manual zic / local /" | ./mysql -u root mysql

Isso funcionou para mim.

Rem
fonte