web-dev-qa-db-fra.com

convert_tz renvoie null

Je sais que cela semble stupide, mais quand je l'utilise

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

il sort NULL. J'utilise MySQL Workbench dans Ubuntu 12.04 64 bits et cela fonctionne dans mon autre ordinateur portable/OS (utilisant également MySQL Workbench).

78
mohur

Cela se produira si vous n'avez pas chargé la table de fuseaux horaires dans mysql.

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

J'ai trouvé ce fil après avoir passé un certain temps à essayer de comprendre pourquoi, après avoir exécuté la commande dans la réponse acceptée (qui est identique sur le site de développement de MySQL), la commande n'a pas pu être convertie entre les fuseaux horaires tels que

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

Il se trouve que sur OS X, deux fichiers posent problème: /usr/share/zoneinfo/Factory et /usr/share/zoneinfo/+VERSION

Le correctif ... déplaçant temporairement ces fichiers vers un emplacement différent, tel que /usr/share/zoneinfo/.bak/, autorise la commande

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

pour remplir complètement toutes les informations de fuseau horaire attendues.

Cela peut ou peut ne pas être un bogue dans ma version installée de MySQL:

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

Je travaille également dans STRICT_MODE.

En tout cas, j'espère que cela épargnera quelques maux de tête à quiconque cherche le correctif.

24
Jim Schubert

En dehors de l’environnement Windows, vous pouvez définir le fuseau horaire par 

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

Dans l'environnement Windows,

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

2. Stop MySQL server

3. Put then inside Mysql installation package (ie. C:\Program Files\MySQL\data\mysql) `

4. Start MySQL server

..Votre travail est terminé ..

Si vous obtenez toujours NULL pour CONVERT_TZ Téléchargez ces tables de base de données et insérez-les dans la base de données mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

Maintenant, votre problème sera résolu .. :)

13
Rakesh

Si vous utilisez MySql sous Windows, vous devez charger les données du fuseau horaire dans le schéma mysql. Voici un bon HOWTO: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

Si vous ne le faites pas, la fonction CONVERT_TZ ne reconnaîtra pas le fuseau horaire de votre entrée (c'est-à-dire vos exemples: 'UTC', 'Asia/Jakarta') et retournera simplement NULL.

2
Domenic D.
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

si vous obtenez l'erreur data too long for column 'abbreviation' at row 1.__, consultez: https://bugs.mysql.com/bug.php?id=68861

le correctif serait d'exécuter ce qui suit

cela ajoutera une ligne pour désactiver le mode mysql et autoriser mysql à insérer des données tronquées.

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
1
Timo Huovinen

Voici les étapes à suivre pour que cela fonctionne si vous utilisez Windows et que vous utilisez MySQL 5.7.

  1. Cliquez avec le bouton droit sur Poste de travail/Ordinateur/Ce PC ou le nom de votre système d'exploitation, puis choisissez Propriétés.
  2. Choisissez "Paramètres système avancés" dans le panneau de gauche.
  3. Choisissez "Variables d'environnement", entrez le chemin d'accès complet de votre répertoire bin MySQL (généralement, il se trouvera dans C:\Program Files\MySQL\MySQL Server 5.7\bin).
  4. Ouvrez l'invite cmd, entrez dans mysql en utilisant mysql -u root -p password.
  5. Entrez use mysql pour sélectionner la base de données MySQL.
  6. Téléchargez le fichier "timezone_YYYYc_posix_sql.Zip" (à la place de YYYY, remplacez l'année maximale disponible dans cette page comme 2017 ou 2018) à partir de https://dev.mysql.com/downloads/timezones.html .
  7. Extrayez-le et ouvrez le fichier dans l'éditeur de texte.
  8. Copiez le contenu et exécutez-le dans l'invite cmd.

En cas de réussite, vous devriez pouvoir utiliser CONVERT_TZ et d’autres fonctions de fuseau horaire.

1
Stranger

1) Sous Windows, il n’ya pas de dossier de données dans C:\Program Files\MySQL\ comme dans les autres réponses. 

2) Dans ce cas, recherchez C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Généralement ce dossier est caché et vous ne verrez pas C:\ProgramData\ quelques fois. 

3) Modifiez les paramètres dans l'onglet Affichage pour afficher les fichiers et dossiers cachés comme expliqué ici https://irch.info/index.php?pg=kb.page&id=133

4) Arrêtez le service MySQL en recherchant "services" dans le bouton Démarrer de Windows.

5) Décompressez ensuite timezone_2017c_posix.Zip, puis copiez-y les fichiers (copiez-les directement, ne copiez pas le dossier en entier) et collez-les C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) Pour MySQL 5.7, timezone_2017c_posix.Zip donnera simplement un fichier .sql après avoir décompressé le fichier et ne risque pas de résoudre le problème. Alors allez-y et téléchargez le fichier Zip pour 5.6 même si vous utilisez MySQL 5.7 et copiez ces fichiers dans C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\ 

7) Redémarrez le serveur MySQL. Pour vérifier si CONVERT_TZ () fonctionne, exécutez cette requête SQL.

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); et vérifiez la sortie non nulle. 

1
shanu

MAMP PRO

  1. Ouvrir 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/
0
Jaseem Abbas