convert_tz renvoie null

92

Je sais que cela semble stupide, mais quand j'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 (également en utilisant MySQL Workbench).

mohur
la source

Réponses:

174

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

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Barmar
la source
1
Avez-vous juste besoin de le faire une fois, ou à chaque fois que MySql démarre?
Abe Miessler
3
Juste une fois. Il charge les informations dans une table dans MySQL, qui est ensuite utilisée.
Barmar
2
Vous pouvez également utiliser l'indicateur de force pour remplacer les erreurs que vous rencontrez: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
scum
3
J'avais également besoin de redémarrer le démon MySQL avant qu'il n'entre en vigueur (sur Debian).
Ekster
2
Salut, lorsque j'exécute cette commande, j'ai une erreur comme celle-ci: Avertissement: Impossible de charger «/usr/share/zoneinfo/iso3166.tab» comme fuseau horaire. Sauter. Avertissement: impossible de charger «/usr/share/zoneinfo/zone.tab» comme fuseau horaire. Sauter.
Ghanshyam Katriya
26

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 la même sur le site de développement de MySQL), la commande n'a pas pu convertir entre les fuseaux horaires tels que

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

Il s'avère que sur OS X, deux fichiers posent des problèmes: /usr/share/zoneinfo/Factoryet /usr/share/zoneinfo/+VERSION.

Le correctif ... déplacer temporairement ces fichiers vers un emplacement différent tel que /usr/share/zoneinfo/.bak/permet la commande

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

pour renseigner entièrement toutes les informations de fuseau horaire attendues.

Cela peut ou non ê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

J'opère également en STRICT_MODE.

Dans tous les cas, j'espère que cela évitera quelques maux de tête à quiconque recherche le correctif.

Jim Schubert
la source
13

En dehors de l'environnement Windows, vous pouvez définir le fuseau horaire en

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

Dans l' environnement 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 (c.-à-d. C: \ Program Files \ MySQL \ data \ mysql) `

4. Start MySQL server

.. Votre travail est terminé.

Si encore vous obtenez NULLpour CONVERT_TZ télécharger ces tables de base de données et l' insérer dans la base de données MySQL http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

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

Rakesh
la source
2

Si vous utilisez MySql sous Windows, vous devez charger les données de 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 votre fuseau horaire d'entrée (c'est-à-dire vos exemples: 'UTC', 'Asia / Jakarta'), et retournera simplement NULL.

Domenic D.
la source
2

MAMP PRO

  1. Ouvert 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
la source
Autre que l'emplacement du dossier binaire, cela s'applique à macOS en général. Merci!
colonelclick
2

1) Sous Windows, il n'y a aucun dossier de données maintenant 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 le verrez pas C:\ProgramData\parfois.

3) Modifiez les paramètres dans l'onglet Affichage pour voir 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) Ensuite, décompressez le timezone_2017c_posix.zip, puis copiez-y les fichiers (copiez les fichiers directement, ne copiez pas tout le dossier lui-même), et collez-le C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) Pour MySQL 5.7, timezone_2017c_posix.zip donnera juste un fichier .sql après la décompression et cela ne résoudra pas le problème. Alors allez-y et téléchargez le fichier zip pour 5.6 même si vous exécutez MySQL 5.7 et copiez ces fichiers dansC:\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.

Shanu
la source
1
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 permettre à mysql d'insérer des données tronquées c'était à cause d'un bogue mysql où mysql ajouterait un caractère nul à la fin (selon le lien ci-dessus)

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
la source
J'ai OSX El Capitan et c'est la seule réponse pour le faire fonctionner. Pour référence future: dans mon cas, l'erreur indique: "Données trop longues pour la colonne 'Abréviation' à la ligne 1". Remarque: tous les efforts pour faire (sudo) mkdir ou (sudo) mv des fichiers mentionnés dans d'autres réponses aboutissent à une `` autorisation refusée ''
hepabolu
BTW je n'ai pas besoin de redémarrer MySQL.
hepabolu
1

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

  1. Faites un clic droit sur Poste de travail / Ordinateur / Ce PC ou quel que soit le nom de votre système d'exploitation et 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 sera 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 mysqlpour 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 maximum 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_TZet d'autres fonctions de fuseau horaire.

Étranger
la source
0

Sur Mac OS Catalina lors de l'utilisation de XAMPP,

Accédez au dossier / Applications / XAMPP / xamppfiles / bin dans Terminal puis exécutez ce qui suit.

./mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e "s / Le fuseau horaire local doit être défini - voir la page de manuel zic / local /" | ./mysql -u racine mysql

Cela a fonctionné pour moi.

Rem
la source