web-dev-qa-db-fra.com

Comment obtenir le fuseau horaire actuel de MySQL?

Quelqu'un sait s'il existe une telle fonction dans MySQL?

METTRE À JOUR

Cela ne donne aucune information valide:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Ou peut-être que MySQL lui-même ne peut pas connaître exactement le time_zone utilisé, c'est bien, nous pouvons impliquer PHP ici, tant que je peux obtenir des informations valides non pas comme SYSTEM...

162
user198729

Extrait du manuel ( section 9.6 ):

Les valeurs actuelles des fuseaux horaires globaux et spécifiques au client peuvent être récupérées comme suit:
_mysql> SELECT @@global.time_zone, @@session.time_zone;_

Edit Ce qui précède retourne SYSTEM si MySQL est défini sur Esclave pour le fuseau horaire du système, ce qui est très peu utile. Puisque vous utilisez PHP, si la réponse de MySQL est SYSTEM, vous pouvez alors demander au système quel fuseau horaire il utilise via - date_default_timezone_get . (Bien sûr, comme VolkerK l'a souligné, PHP peut s'exécuter sur un serveur différent, mais comme le supposent les choses, en supposant que le serveur Web et le serveur de base de données avec lesquels il parle soient défini sur [si ce n'est pas réellement dans] le même fuseau horaire n'est pas un énorme saut.) Mais méfiez-vous que (comme avec MySQL), vous pouvez définir le fuseau horaire que PHP utilise ( date_default_timezone_set ), ce qui signifie qu'il peut indiquer une valeur différente de celle utilisée par le système d'exploitation. Si vous contrôlez le code PHP, vous devez savoir si vous le faites et tout va bien.

Mais la question de savoir quel fuseau horaire est utilisé par le serveur MySQL peut être une tangente, car demander au serveur quel fuseau horaire il indique ne (absolument) rien à propos des données dans la base de données. Lisez la suite pour plus de détails:

Discussion complémentaire :

Si vous contrôlez le serveur, vous pouvez bien sûr vous assurer que le fuseau horaire est une quantité connue. Si vous ne maîtrisez pas le serveur, vous pouvez définir le fuseau horaire utilisé par votre connexion comme suit:

_set time_zone = '+00:00';
_

Cela définit le fuseau horaire sur GMT, de sorte que toute opération ultérieure (telle que now()) utilise GMT.

Notez cependant que les valeurs d'heure et de date sont not ​​stockées avec les informations de fuseau horaire dans MySQL:

_mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
_

Donc, connaître le fuseau horaire du serveur n’est important que pour les fonctions qui permettent d’obtenir le temps présent, comme now(), unix_timestamp(), etc. il ne vous dit rien sur le fuseau horaire que les dates dans la base de données utilisent. Vous pouvez choisir de supposer ils ont été écrits en utilisant le fuseau horaire du serveur, mais cette hypothèse peut très bien être erronée. Pour connaître le fuseau horaire de toutes les dates ou heures stockées dans les données, vous devez vous assurer qu'elles sont stockées avec les informations de fuseau horaire ou (comme je le fais) qu'elles sont toujours à l'heure GMT.

Pourquoi supposer que les données ont été écrites en utilisant le fuseau horaire du serveur défectueux? D'une part, les données ont peut-être été écrites à l'aide d'une connexion qui définit un fuseau horaire différent. La base de données a peut-être été déplacée d'un serveur à un autre, où les serveurs étaient situés dans des fuseaux horaires différents (je me suis heurté à cela lorsque j'ai hérité d'une base de données déplacée du Texas vers la Californie). Mais même si les données sont écrites sur le serveur, avec son fuseau horaire actuel, elles restent ambiguës. L'année dernière, aux États-Unis, l'heure d'été a été désactivée à 14 heures le 1er novembre. Supposons que mon serveur se trouve en Californie avec le fuseau horaire Pacifique et que j'ai la valeur _2009-11-01 01:30:00_ dans la base de données. Quand était-ce? Était-ce 13 h 30, heure avancée du Pacifique, ou 1 h 30, heure avancée du Pacifique, le 1er novembre (une heure plus tard)? Vous n'avez absolument aucun moyen de savoir. Moral: Enregistrez toujours les dates/heures au format GMT (sans heure d’été) et convertissez-les dans le fuseau horaire souhaité, le cas échéant.

206
T.J. Crowder

La requête ci-dessous renvoie le fuseau horaire de la session en cours.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
161
JohnZ

Simplement SELECT @@system_time_zone;

Renvoie PST (ou tout ce qui concerne votre système).

Si vous essayez de déterminer le fuseau horaire de la session, vous pouvez utiliser cette requête:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Ce qui retournera le fuseau horaire de la session s’il diffère du fuseau horaire du système.

84
Andrew

Comme Jakub Vrána (le créateur ou Adminer et NotORM ) mentionne dans les commentaires, pour sélectionner le décalage de fuseau horaire actuel dans TIME, utilisez:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Il renverra: 02:00:00 si votre fuseau horaire est +2: 00 pour cette date.

J'ai créé un tableau de bord ici: Le fuseau horaire de MySQL doit-il être défini sur UTC?

51
Timo Huovinen
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Cela retournera le fuseau horaire sous forme d’entier (par exemple: -6), en manipulant les temps positifs ou négatifs (voici où EXTRACT entre en jeu: la fonction HOUR renvoie à elle seule les fuseaux horaires négatifs).

6
Black Shell

Pour obtenir le fuseau horaire actuel du mysql, vous pouvez effectuer les opérations suivantes:

  1. SELECT @@ system_time_zone; // à partir de cela, vous pouvez obtenir le fuseau horaire du système 
  2. SELECT IF (@@ session.time_zone = 'SYSTEM', @@ system_time_zone, @@ session.time_zone) // Ceci vous donnera le fuseau horaire si le fuseau horaire du système est différent du fuseau horaire global.

Maintenant, si vous voulez changer le fuseau horaire mysql, alors: 1. SET GLOBAL time_zone = '+00: 00' // cela va régler le fuseau horaire mysql en UTC 2. SET @@ session.time_zone = "+00: 00"; // vous pouvez ainsi modifier le fuseau horaire uniquement pour votre session particulière 

5
Abhinav bhardwaj

sélectionnez sec_to_time (TIME_TO_SEC (curtime ()) + 48000); Ici, vous pouvez spécifier vos différences de temps en secondes

2
Bala Kayan

Consultez Support du fuseau horaire du serveur MySQL et la variable system_time_zone system. Est ce que ça aide?

2
Pekka 웃

La commande mentionnée dans la description renvoie "SYSTEM", qui indique que le fuseau horaire du serveur est pris. Ce qui n'est pas utile pour notre requête.

La requête suivante aidera à comprendre le fuseau horaire

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

La requête ci-dessus vous donnera l'intervalle de temps par rapport au temps universel coordonné (UTC). Ainsi, vous pouvez facilement analyser le fuseau horaire. Si le fuseau horaire de la base de données est IST, la sortie sera 5h30. 

UTC_TIMESTAMP

Dans MySQL, UTC_TIMESTAMP renvoie la date et l'heure UTC actuelles sous forme de valeur "AAAA-MM-JJ HH: MM: SS" ou YYYYMMDDHHMMSS.uuuuuu, en fonction de l'utilisation de la fonction i.e.

À PRÉSENT()

Fonction NOW (). MySQL NOW () renvoie la valeur de la date et de l’heure actuelles au format 'AAAA-MM-JJ HH: MM: SS' ou AAAAMMJJHHMMSS.uuuuuu, en fonction du contexte (numérique ou chaîne) de la fonction. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sont synonymes de NOW ().

1
Amitesh

Mon PHP utilise le framework

SET LOCAL time_zone='Whatever'

on after connect, où '' Whatever '== date_default_timezone_get ()

Ce n’est pas ma solution, mais cela garantit que le fuseau horaire SYSTEM du serveur MySQL est toujours identique à celui de PHP

Donc, oui PHP est fortement impliqué et peut l’affecter

1
vladkras

Insérez un enregistrement factice dans l'une de vos bases de données ayant un horodatageSélectionnez cet enregistrement et obtenez la valeur timestamp . Supprimez cet enregistrement. Obtient avec certitude le fuseau horaire utilisé par le serveur pour écrire des données et ignore les fuseaux horaires PHP.

0
alee

Vous devez juste redémarrer mysqld après avoir modifié le fuseau horaire de System.

Le fuseau horaire global de MySQL prend le fuseau horaire de System. Lorsque vous modifiez un tel attribut du système, vous avez simplement besoin d'un redémarrage de Mysqld.

0
Storm Young

Utilisez LPAD (TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP), ’% H:% i’), 6, ’+ ')) pour obtenir une valeur au format du fuseau horaire de MySQL que vous pouvez facilement utiliser avec CONVERT_TZ (). Notez que le décalage de fuseau horaire que vous obtenez n'est valide qu'au moment où l'expression est évaluée, car le décalage peut changer dans le temps si vous avez l'heure d'été. Pourtant, l’expression est utile avec NOW () pour stocker le décalage avec l’heure locale, ce qui désambiguise ce que NOW () donne. (Dans les fuseaux horaires DST, NOW () recule d'une heure une fois par an et a donc des valeurs en double pour des instants distincts).

0
rtc

Pour obtenir l'heure actuelle en fonction de votre fuseau horaire, vous pouvez utiliser ce qui suit (dans mon cas, il s'agit de '+5: 30')

sélectionnez DATE_FORMAT (convert_tz (now (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d')

0
Sanjoy Kanrar