Si cela donne null, les tables TZ n'ont pas été configurées :
SELECT CONVERT_TZ(now(),'US/Eastern','US/Central');
Si vous n'avez pas configuré les tables de fuseaux horaires, vous pouvez mettre à jour le décalage horaire dans la table utilisateur, puis faire :
select utc_timezone() - interval user_timezone_offset_in_hours hour
from userinfo a
where user_id = 999;
Cependant, vous aurez toujours besoin d'un moyen de mettre à jour le fuseau horaire de l'utilisateur.
Si vous écrivez ceci pour une application Web, vous pouvez obtenir le fuseau horaire via javascript, voici un article qui décrit comment (je n'ai pas essayé cela, mais il semble que cela fonctionnera).
Une petite explication concernant "l'intervalle" ci-dessus...
L'une des constructions les plus astucieuses de MySQL est l'utilisation de INTERVAL
mot-clé, mieux illustré par l'exemple (la valeur numérique peut être une expression ou la valeur du champ)
select now() today, now() - interval 1 day yesterday;
+---------------------+---------------------+
| today | yesterday |
+---------------------+---------------------+
| 2011-05-26 13:20:55 | 2011-05-25 13:20:55 |
+---------------------+---------------------+
Vous pouvez les ajouter et les soustraire comme bon vous semble, c'est pourquoi je jamais s'embêter avec les fonctions d'addition/soustraction/conversion de date/heure
select now() a, now() - interval 1 day + interval 4 hour + interval 8 minute b;
+---------------------+---------------------+
| a | b |
+---------------------+---------------------+
| 2011-05-26 13:24:16 | 2011-05-25 17:32:16 |
+---------------------+---------------------+
Vous pouvez utiliser des nombres négatifs (cela devrait être bon pour les décalages de fuseau horaire négatifs), ce sont les mêmes :
select now() - interval 1 month a, now() + interval -1 month b;
+---------------------+---------------------+
| a | b |
+---------------------+---------------------+
| 2011-04-26 13:38:05 | 2011-04-26 13:38:05 |
+---------------------+---------------------+