2010-02-13 6 views
22

Cela semble assez simple, mais je n'ai pas été en mesure de comprendre comment utiliser une instruction SELECT simple pour retourner l'heure actuelle dans GMT.Requête MySQL pour l'heure GMT en cours

J'ai essayé d'utiliser CONVERT_TZ() pour convertir NOW() à GMT en fonction du fuseau horaire du serveur et du fuseau horaire GMT mais pour une raison quelconque, il renvoie NULL lorsque j'ai mis dans les fuseaux horaires de texte. La seule façon d'obtenir un résultat est de mettre en place les compensations qui deviennent trop compliquées pour ce qui devrait être une opération vraiment simple. Voici ce que je veux dire:

mysql> SELECT CONVERT_TZ(NOW(),@@global.system_time_zone,'GMT'); 
NULL 

mysql> SELECT CONVERT_TZ(NOW(),'PST','GMT'); 
NULL 

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00'); 
2010-02-13 18:28:22 

Tout ce dont j'ai besoin est une simple requête pour retourner l'heure actuelle en GMT. Merci d'avance pour votre aide!

+1

Remarque: Utilisez le temps UTC si vous avez besoin d'une référence de temps universel. C'est la vraie référence, pas GMT. Ce dernier change lorsque l'heure d'été est activée. –

+0

@culebron - Merci pour cette suggestion! La question est toujours là.Comment puis-je utiliser une instruction select simple pour obtenir l'heure UTC actuelle? –

Répondre

31

cela devrait fonctionner, mais avec

SELECT CONVERT_TZ(NOW(),'PST','GMT'); 

je suis aussi NULL comme résultat. assez drôle l'exemple dans le docu mysql renvoie également null

SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); 

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz vous semble trouvé un bogue dans MySQL . (Grâce à + Stephen Pritchard)

vous pouvez essayer:

SET @[email protected]@TIME_ZONE; 
SET TIME_ZONE='+00:00'; 
SELECT NOW(); 
SET [email protected]_TIME_ZONE; 

ok est pas exactement ce que vous vouliez (ses 4 requêtes, mais seulement une sélection :-)

ou vous utilisez UTC (ne marche pas avec le temps s'affecté de l'heure d'été)

SELECT UTC_TIMESTAMP(); 
+3

@Rufinus - Bon, je ne suis pas fou. Comment MySQL peut-il avoir un bug dans une fonction aussi importante? Le UTC_TIMESTAMP() était exactement ce que je cherchais. Merci! –

+0

Que faire si la base de données enregistre des enregistrements dans UTC et les recherche en utilisant le fuseau horaire actuel? à un moment le fuseau horaire en général était gmt -1 et après 6 mois il devient gmt +1 ?? – shzyincu

13

NO BOGUE dans CONVERT_TZ()

Pour utiliser CONVERT_TZ(), vous devez installer les tables de fuseaux horaires sinon MySql renvoie NULL.

De la CLI exécutez la commande suivante en tant que root

# mysql_tzinfo_to_sql/usr/share/zoneinfo | root mysql mysql

VOIR http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

Merci

http://www.ArcanaVision.com (SJP) 2011-08-18

+0

Cela a fonctionné pour moi presque chaque fois, mais cette fois 'convert_tz()' renvoie NULL même après la mise à jour du fuseau horaire. étrange! et j'ai vérifié - les tables de timezone_xxx sont pleines. ma version de serveur est 5.0.92, compilée à partir de la source (comme je le fais toujours). Jamais eu ce problème avant ... – NickSoft

+3

Juste découvert que, après avoir rempli la zone de fuseaux horaires de la table «PST» n'existe toujours pas. J'ai lu dans wikipedia et il semble que PST n'est pas assez clair pour définir un fuseau horaire en raison de l'heure d'été. Certaines villes utilisent DST, d'autres ne le font pas. Voir: http://en.wikipedia.org/wiki/Pacific_Time_Zone#Daylight_time. J'ai utilisé Pacific/Los_Angeles plutôt que PST (pour prendre en compte DST). – NickSoft

+1

J'ai dû utiliser 'US/Pacific' pour obtenir une valeur non NULL de convert_tz() sur ma base de données 5.5.27. J'ai trouvé cette chaîne en parcourant la table mysql.time_zone_name. – randalv

0

Après avoir vu toutes les réponses ci-dessus et de voir qu'il est peu fiable pour convertir PST, Je viens d'utiliser ceci:

DATE_SUB (user_last_login, INTERVAL 7 heures)

+0

désolé, pas clair comment il est lié à la question –

+0

Cela ne tient pas compte des règles DST. – Zambonilli

0

Cela devrait fonctionner - Je pense que vous spécifiez votre fuseau horaire erroné. L'utilisation de Chicago comme exemple

SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT') 
+0

renvoie null :( – shzyincu

+1

Pour utiliser CONVERT_TZ(), vous devez installer les tables de fuseaux horaires sinon MySql renvoie NULL! Ils ne sont pas préinstallés dans mysql – konung

4

Le moyen infaillible pour aller chercher le datetime UTC est:

SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+0:00') 
-1

Il n'y a pas de bug dans la fonction CONVERT_TZ. Vous obtenez NULL parce que vous utilisez des noms/abréviations de fuseaux horaires. Mysql ne sait pas ce que signifie 'GMT', 'PST', etc, sauf si vous installez la table mysql.time_zone_name. Cependant, si vous utilisez des chiffres, cela fonctionnera toujours.

mysql> SELECT CONVERT_TZ(NOW(), 'America/Chicago', 'GMT'); 

retourne NULL

mysql> SELECT CONVERT_TZ(NOW(),'-08:00','+00:00'); 

retours 2016-06-24 17:58:33

0

Lorsque l'horodatage du serveur source est inconnue, mais l'exigence est un tz spécifique faire:

select convert_tz(utc_timestamp(),'+05:00','+00:00') 

Ceci utilise CST comme exemple. utc_timestamp garantit un résultat '+00: 00', peu importe où vous l'interrogez. Le '+05: 00' est le décalage souhaité. Cela fonctionne très bien lors de la frappe de plusieurs serveurs inconnus et il vous assure que le résultat de retour sera tous dans un jeu de résultats tz commun.

0

je cherchais mon fuseau horaire qui est GMT + 6 (Fuseau horaire Asie/Dhaka)

serveur MySQL est aux États-Unis. Le ci-dessous a fonctionné pour moi.

SELECT CONVERT_TZ (UTC_TIMESTAMP(), '+06: 00', '+00: 00')