Tout le monde sait s'il existe une telle fonction dans MySQL?
METTRE À JOUR
Cela ne génère 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 l' time_zone
utilisation, c'est bien, nous pouvons impliquer PHP
ici, tant que je peux obtenir des informations valides pas comme SYSTEM
...
@@system_time_zone
comme indiqué dans ma réponse ci-dessous.Réponses:
Dans le manuel ( section 9.6 ):
Modifier Ce qui précède revient
SYSTEM
si MySQL est réglé sur esclave du fuseau horaire du système, ce qui est moins qu'utile. Puisque vous utilisez PHP, si la réponse de MySQL estSYSTEM
, vous pouvez alors demander au système par quel fuseau horaire il utilisedate_default_timezone_get
. (Bien sûr, comme l'a souligné VolkerK, PHP peut s'exécuter sur un serveur différent, mais selon les hypothèses, en supposant que le serveur Web et le serveur de base de données avec lesquels il parle sont définis sur [sinon en fait dans ] le même fuseau horaire n'est pas un énorme saut.) Mais attention (comme avec MySQL), vous pouvez définir le fuseau horaire que PHP utilise (date_default_timezone_set
), ce qui signifie qu'il peut signaler 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 être d'accord.Mais toute la question du fuseau horaire utilisé par le serveur MySQL peut être tangente, car demander au serveur dans quel fuseau horaire il ne vous dit absolument rien sur les données de la base de données. Lisez la suite pour plus de détails:
Discussion supplé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 contrôlez pas le serveur, vous pouvez définir le fuseau horaire utilisé par votre connexion comme ceci:
Cela définit le fuseau horaire sur GMT, de sorte que toute autre opération (comme
now()
) utilise GMT.Notez cependant que les valeurs d'heure et de date ne sont pas stockées avec les informations de fuseau horaire dans MySQL:
Donc , sachant le fuseau horaire du serveur est seulement important en termes de fonctions qui obtiennent le temps en ce moment, comme
now()
,unix_timestamp()
, etc .; il ne vous dit rien sur le fuseau horaire utilisé par les dates dans les données de la base de données. Vous pouvez choisir de supposer qu'elles ont été écrites à l'aide du fuseau horaire du serveur, mais cette hypothèse pourrait 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 des informations de fuseau horaire ou (comme je le fais) qu'elles sont toujours en GMT.Pourquoi l'hypothèse selon laquelle les données ont été écrites à l'aide du fuseau horaire du serveur est-elle défectueuse? Eh bien, d'une part, les données peuvent avoir é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 se trouvaient dans des fuseaux horaires différents (je suis tombé dessus lorsque j'ai hérité d'une base de données qui était passée du Texas à 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 à 2h00 du matin le 1er novembre. Supposons que mon serveur se trouve en Californie en utilisant le fuseau horaire du Pacifique et que j'ai la valeur
2009-11-01 01:30:00
dans la base de données. Quand était-ce? Était-ce à 1 h 30 le 1er novembre HAP ou à 1 h 30 le 1er novembre HNP (une heure plus tard)? Vous n'avez absolument aucun moyen de le savoir. Moralité: stockez toujours les dates / heures au format GMT (qui ne fait pas l'heure d'été) et convertissez-les au fuseau horaire souhaité si / lorsque nécessaire.la source
DATETIME
type mySQL ne contient pas d'informations sur le fuseau horaire. Par conséquent, je pense que la philosophie sous-jacente ici est que mySQL soit aussi aveugle que possible sur le fuseau horaire - ce qui signifie que l'utilisateur doit respecter un fuseau horaire, UTC ou le fuseau horaire dans lequel se trouve le serveur, stocker tout dans cette zone, et faire des conversions au niveau de l'application ou en utilisantCONVERT_TZ()
( dev.mysql.com/doc/refman/5.0/en/… ) C'est du moins ainsi que j'ai toujours compris comment il est censé fonctionner, en regardant les rares options fournies par mySQL dans ce domaine.now()
PHP?La requête ci-dessous renvoie le fuseau horaire de la session en cours.
la source
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
est plus simple.SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
pour obtenir la différence en quelques secondes.Simplement
SELECT @@system_time_zone;
Retours
PST
(ou tout ce qui est pertinent pour 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);
Qui renverra le fuseau horaire de la session s'il diffère du fuseau horaire du système.
la source
Comme Jakub Vrána (Le créateur ou Adminer et NotORM ) mentionne dans les commentaires, pour sélectionner le fuseau horaire actuel décalage dans l'
TIME
utilisation:Il reviendra:
02:00:00
si votre fuseau horaire est +2: 00 pour cette dateJ'ai fait une feuille de triche ici: MySQL devrait - il avoir son fuseau horaire réglé sur UTC?
la source
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
pour obtenir la différence en quelques secondes.02:00:00
, le TIMESTAMPDIFF correspondant retournera-2
si l'unité est HOUR,-120
si l'unité est MINUTE, etc. Pour obtenir le signe correspondant au fuseau horaire, permutez les paramètres:SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())
retournera le120
fuseau horaire attendu +2: 00. La raison pour spécifier des minutes est qu'il y a quelques fuseaux horaires décalés de 30 ou 45 minutes, voir en.wikipedia.org/wiki/Time_zonePour obtenir le fuseau horaire actuel du mysql, vous pouvez faire les choses suivantes:
Maintenant, si vous voulez changer le fuseau horaire mysql alors:
la source
Cela retournera le fuseau horaire sous la forme d'un entier (par exemple
-6
:), gérant les temps positifs ou négatifs (voici oùEXTRACT
entre en jeu: laHOUR
fonction seule retourne les fuseaux horaires négatifs comme positifs).la source
A tous ceux qui viennent trouver le fuseau horaire de mysql db.
Avec cette requête, vous pouvez obtenir le fuseau horaire actuel:
la source
La commande mentionnée dans la description renvoie "SYSTEM" qui indique qu'il prend le fuseau horaire du serveur. Ce qui n'est pas utile pour notre requête.
La requête suivante aidera à comprendre le fuseau horaire
La requête ci-dessus vous donnera l'intervalle de temps par rapport au temps universel coordonné (UTC). Vous pouvez donc 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 au format 'YYYY-MM-DD HH: MM: SS' ou YYYYMMDDHHMMSS.uuuuuu selon l'utilisation de la fonction, c'est-à-dire dans un contexte de chaîne ou numérique.
MAINTENANT()
Fonction NOW (). MySQL NOW () renvoie la valeur de la date et de l'heure actuelles au format 'YYYY-MM-DD HH: MM: SS' ou YYYYMMDDHHMMSS.uuuuuu selon le contexte (numérique ou chaîne) de la fonction. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sont des synonymes de NOW ().
la source
Consultez la prise en charge du fuseau horaire du serveur MySQL et la
system_time_zone
variable système. Est ce que ça aide?la source
Mon framework PHP utilise
après la connexion, où «Quoi que» == date_default_timezone_get ()
Ce n'est pas ma solution, mais cela garantit que le
SYSTEM
fuseau horaire du serveur MySQL est toujours le même que celui de PHPDonc, oui, PHP est fortement impliqué et peut l'affecter
la source
Pour obtenir l'heure actuelle en fonction de votre fuseau horaire, vous pouvez utiliser ce qui suit (dans mon cas, son '+5: 30')
la source
Il vous suffit de redémarrer mysqld après avoir modifié le fuseau horaire du système.
Le fuseau horaire global de MySQL prend le fuseau horaire du système. Lorsque vous modifiez un tel attribut de système, vous avez juste besoin d'un redémarrage de Mysqld.
la source
Insérez un enregistrement factice dans l'une de vos bases de données qui possède un horodatage Sélectionnez cet enregistrement et obtenez la valeur de l'horodatage. Supprimez cet enregistrement. Obtient avec certitude le fuseau horaire que le serveur utilise pour écrire des données et ignore les fuseaux horaires PHP.
la source
Vous pouvez essayer ce qui suit:
Ici, vous pouvez spécifier votre décalage horaire en secondes
la source
Utilisez
LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')
pour obtenir une valeur au format de fuseau horaire de MySQL que vous pouvez facilement utiliser avecCONVERT_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 au fil du temps si vous avez l'heure d'été. Pourtant, l'expression est utile avecNOW()
pour stocker le décalage avec l'heure locale, ce quiNOW()
rend sans ambiguïté ce qui donne. (Dans les fuseaux horaires DST,NOW()
recule d'une heure une fois par an, a donc des valeurs en double pour des moments distincts).la source
C'est possible
Vous n'obtiendrez pas directement la valeur du fuseau horaire de cette façon.
@@global.time_zone
ne peut pas être utilisé car il s'agit d'une variable et il renvoie la valeur'SYSTEM'
.Si vous devez utiliser votre requête dans une session avec un fuseau horaire modifié à l'aide de
session SET TIME_ZONE =
, vous obtiendrez cela avec@@session.time_zone
. Si vous interrogez@@global.time_zone
, vous obtenez'SYSTEM'
.Si vous essayez
datediff
,date_sub
outimediff
avecnow()
etutc_time()
, vous rencontrerez probablement des problèmes de conversion.Mais les choses suggérées ci-dessus fonctionneront probablement au moins avec certaines versions de serveur. Ma version est 5.5.43-37 et est une solution hébergée.
la source
Essayez d'utiliser le code suivant:
la source