Come posso ottenere il fuso orario corrente di MySQL?


217

Qualcuno sa se esiste una tale funzione in MySQL?

AGGIORNARE

Questo non produce informazioni valide:

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

O forse lo stesso MySQL non può sapere esattamente l' time_zoneusato, va bene, possiamo coinvolgerlo PHPqui, finché posso ottenere informazioni valide non come SYSTEM...


3
"qui possiamo coinvolgere PHP" - e quell'istanza di php sarebbe sempre sulla stessa macchina del server MySQL?
VolkerK,

Sì, saranno sulla stessa macchina.
user198729,

10
Prova @@system_time_zonecome indicato nella mia risposta di seguito.
Andrew,

Da quando è stata posta la domanda sono state aggiunte altre risposte, forse riesaminare la risposta accettata?
Timo Huovinen,

1
Anche se il server MySQL e PHP si trovano sullo stesso server, possono raccogliere fusi orari diversi in base alle loro impostazioni. E questi tempi possono differire da ciò che mostra il tuo sistema operativo e da PHP / MySQL.
Bimal Poudel,

Risposte:


227

Dal manuale ( sezione 9.6 ):

I valori correnti dei fusi orari globali e specifici del cliente possono essere recuperati in questo modo:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Modifica Quanto sopra restituisce SYSTEMse MySQL è impostato come slave sul fuso orario del sistema, il che è meno utile. Dato che stai usando PHP, se la risposta di MySQL è SYSTEM, puoi quindi chiedere al sistema quale fuso orario sta usando date_default_timezone_get. (Naturalmente, come ha sottolineato VolkerK, PHP potrebbe essere in esecuzione su un server diverso, ma come presuppongono, supponendo che il server Web e il server DB con cui sta parlando siano impostati su [se non effettivamente in ] lo stesso fuso orario non è un enorme salto.) Ma attenzione che (come con MySQL), è possibile impostare il fuso orario utilizzato da PHP (date_default_timezone_set), il che significa che potrebbe riportare un valore diverso da quello utilizzato dal sistema operativo. Se hai il controllo del codice PHP, dovresti sapere se lo stai facendo ed essere a posto.

Ma l'intera domanda su quale fuso orario sta usando il server MySQL può essere tangente, perché chiedere al server in quale fuso orario si trova non dice assolutamente nulla sui dati nel database. Continua a leggere per i dettagli:

Ulteriore discussione :

Se hai il controllo del server, ovviamente puoi assicurarti che il fuso orario sia una quantità nota. Se non hai il controllo del server, puoi impostare il fuso orario utilizzato dalla tua connessione in questo modo:

set time_zone = '+00:00';

Ciò imposta il fuso orario su GMT, in modo che eventuali ulteriori operazioni (come now()) utilizzino GMT.

Si noti, tuttavia, che i valori di ora e data non sono memorizzati con le informazioni sul fuso orario in 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)

Quindi, sapendo il fuso orario del server è importante solo in termini di funzioni che ottengono il tempo in questo momento, come ad esempio now(), unix_timestamp(), ecc .; non ti dice nulla su quale fuso orario stanno usando le date nei dati del database. Potresti scegliere di supporre che siano stati scritti usando il fuso orario del server, ma tale presupposto potrebbe essere errato. Per conoscere il fuso orario di qualsiasi data o ora memorizzata nei dati, è necessario assicurarsi che siano memorizzati con le informazioni sul fuso orario o (come faccio io) assicurarsi che siano sempre in GMT.

Perché si presume che i dati siano stati scritti utilizzando il fuso orario del server difettoso? Bene, per prima cosa, i dati potrebbero essere stati scritti usando una connessione che imposta un fuso orario diverso. Il database potrebbe essere stato spostato da un server a un altro, in cui i server erano in fusi orari diversi (mi sono imbattuto in quello quando ho ereditato un database che si era trasferito dal Texas alla California). Ma anche se i dati sono scritti sul server, con il suo fuso orario attuale, è ancora ambiguo. L'anno scorso, negli Stati Uniti, l'ora legale è stata disattivata alle 2:00 del 1 novembre. Supponiamo che il mio server sia in California utilizzando il fuso orario del Pacifico e che io abbia il valore2009-11-01 01:30:00nel database. Quando era? Era l'1: 30 novembre 1 ° PDT o l'1: 30 novembre 1 ° PST (un'ora dopo)? Non hai assolutamente modo di saperlo. Morale: memorizza sempre le date / orari in GMT (che non fa l'ora legale) e converti nel fuso orario desiderato come / quando necessario.


5
@ user198729: Non è privo di significato , anche se non è altrettanto utile come speravo. Ciò che significa è: chiedi al sistema operativo, MySQL è schiavo di quello.
TJ Crowder,

Solo curioso, perché dobbiamo impostare noi stessi il fuso orario e quindi recuperarlo? Quel tipo di sconfitte lo scopo non è vero? Voglio dire, vorrei chiedere a MySQL il fuso orario perché non conosco la risposta. Forse sono confuso e ho sbagliato le cose. Qualcuno può spiegare?
Senthil

1
@Senthil Il DATETIMEtipo mySQL non contiene informazioni sul fuso orario. Pertanto, penso che la filosofia di base prevista qui sia che mySQL sia il più cieco possibile rispetto al fuso orario, il che significa che l'utente deve attenersi a un fuso orario, UTC o il fuso orario in cui si trova il server, memorizzare tutto in quel fuso e fare qualsiasi conversione a livello di applicazione o usando CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) Almeno, è così che ho sempre capito come dovrebbe funzionare, guardando le poche opzioni fornite da mySQL in questo campo.
Pekka,

Grazie, ma questo non è ancora risolto, come posso ottenere le informazioni tz dal risultato di now()in PHP?
user198729

Sono totalmente d'accordo con la parte "attenersi a un fuso orario quando si salva il timestamp" .. Ma questo-> "..o il fuso orario in cui si trova il server .." come lo scopri? Supponiamo che tu abbia salvato tutti i valori di data e ora come UTC. Ma il tuo server è in un altro fuso orario e vuoi mostrare i valori di data e ora in base a quel fuso orario. Quindi come saprai in quale fuso orario si trova il tuo server? Solo allora puoi passare un valore a CONVERT_TZ () per convertirlo giusto?
Senthil,

196

La query seguente restituisce il fuso orario della sessione corrente.

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

6
Questa è davvero la risposta giusta, perché dimostra che "SYSTEM" è riconosciuto come un fuso orario nella conversione, il che rende pienamente sufficiente la conversione, ad esempio NOW () in qualsiasi fuso orario.
nilskp,

5
Grazie, usando questo sono stato in grado di ottenere il formato che volevo:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)è più semplice.
Jakub Vrána,

3
O SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);per ottenere la differenza in pochi secondi.
philfreo,

106

Semplicemente SELECT @@system_time_zone;

Resi PST(o qualunque cosa sia rilevante per il tuo sistema).

Se stai cercando di determinare il fuso orario della sessione, puoi utilizzare questa query:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Che restituirà il fuso orario della sessione se differisce dal fuso orario del sistema.


6
L'unico aspetto negativo è che se il fuso orario cambia a causa delle modifiche dell'ora legale, riporterà comunque quello che è stato "ricordato" al momento dell'avvio del server, vedere mysql bug 9518
Mark

72

Come Jakub Vrána (Il creatore o Adminer e NotORM ) menziona nei commenti, per selezionare l'attuale offset del fuso orario in TIMEuso:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Restituirà: 02:00:00se il tuo fuso orario è +2: 00 per quella data

Ho creato un cheat sheet qui: MySQL dovrebbe avere il fuso orario impostato su UTC?


O SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);per ottenere la differenza in pochi secondi.
philfreo,

componente aggiuntivo a @philfreo - si noti che i parametri devono essere invertiti in TIMESTAMPDIFF rispetto a TIMEDIFF. Per prendere l'esempio fornito in questa risposta, se TIMEDIFF ritorna 02:00:00, il corrispondente TIMESTAMPDIFF ritornerà -2se l'unità è ORA, -120se l'unità è MINUTO, ecc. Per ottenere il segno che corrisponda al fuso orario, scambiare i parametri: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())restituirà il previsto 120per fuso orario +2: 00. Il motivo per specificare i minuti è che ci sono alcuni fusi orari con offset di 30 o 45 minuti, vedi en.wikipedia.org/wiki/Time_zone
ToolmakerSveve

1
questa è una risposta molto migliore della risposta accettata in quanto risponde direttamente alla domanda e offre una soluzione anziché solo teoria.
Sostituisce il

10

Per ottenere il fuso orario corrente di mysql puoi fare le seguenti cose:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Ora se vuoi cambiare il fuso orario mysql allora:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Questo restituirà il fuso orario come numero intero (ad es . -6:), gestendo i tempi positivi o negativi (qui EXTRACTentra in gioco: la HOURsola funzione restituisce i fusi orari negativi come positivi).


6

Per chiunque venga a trovare il fuso orario di mysql db.

Con questa query è possibile ottenere il fuso orario corrente:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

Il comando menzionato nella descrizione restituisce "SYSTEM" che indica che accetta il fuso orario del server. Che non è utile per la nostra query.

La seguente query aiuterà a comprendere il fuso orario

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

La query sopra ti fornirà l'intervallo di tempo rispetto al tempo coordinato universale (UTC). Quindi puoi facilmente analizzare il fuso orario. se il fuso orario del database è IST, l'output sarà 5:30

UTC_TIMESTAMP

In MySQL, UTC_TIMESTAMP restituisce la data e l'ora UTC correnti come valore nel formato 'AAAA-MM-GG HH: MM: SS' o AAAAMMGGHHMMSS.uuuuuu a seconda dell'uso della funzione, ad esempio in una stringa o in un contesto numerico.

ADESSO()

Funzione NOW (). MySQL NOW () restituisce il valore della data e ora correnti nel formato "AAAA-MM-GG HH: MM: SS" o AAAAMMGGHHMMSS.uuuuuu a seconda del contesto (numerico o stringa) della funzione. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sono sinonimi di NOW ().


2

Dai un'occhiata al supporto fuso orario di MySQL Server e alla system_time_zonevariabile di sistema. Questo aiuta?


@utente, puoi precisare nella tua domanda quali informazioni stai cercando esattamente (il fuso orario del server? Il client?) e quali strumenti sono a tua disposizione? Citi PHP. Puoi accedere alla riga di comando?
Pekka,

5
@utente anche, trovo che tu stia trovando un po 'un coglione che vota le risposte da persone che stanno cercando di essere utili e non esattamente sbagliate. Non mi interessa il voto né la perdita di punti, ma il tuo atteggiamento non è esattamente incoraggiante a cercare una soluzione.
Pekka,

3
@utente, come ho detto, il tuo atteggiamento non mi motiva a ricercare ulteriori risposte per te, soprattutto alla luce delle scarse informazioni fornite. Scusate.
Pekka,

3
@ user198729: Wow, perdi l'atteggiamento. Pekka è il tipo di ragazzo che aiuta davvero le persone. Se la sola cortesia non è sufficiente per motivarti, prova l'interesse personale.
TJ Crowder,

2
Solo i miei pensieri: non mi sarei offeso se l'utente avesse fatto la stessa cosa al mio post. Voglio dire, la pressione alla scadenza o la frustrazione aggiungono alcuni spigoli alle persone, ma penso che dovremmo permetterlo in una certa misura. Forse sto perdonando troppo: |
Senthil,

1

Il mio framework PHP utilizza

SET LOCAL time_zone='Whatever'

acceso dopo la connessione, dove "Qualunque" == date_default_timezone_get ()

Non è la mia soluzione, ma questo assicura SYSTEM fuso orario del server MySQL sia sempre uguale a quello di PHP

Quindi, sì, PHP è fortemente coinvolto e può influenzarlo


1

Per ottenere l'ora corrente in base al fuso orario, puoi utilizzare quanto segue (nel mio caso il suo '+5: 30')

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


0

Devi solo riavviare mysqld dopo aver modificato il fuso orario di System ..

Il fuso orario globale di MySQL prende il fuso orario del sistema. Quando modifichi tali attributi del sistema, devi solo riavviare Mysqld.


dopo aver modificato il fuso orario sul sistema operativo, gli inserti mysql useranno il nuovo fuso orario ma selezionano ora (); e seleziona current_timestamp; i comandi useranno comunque il vecchio fuso orario. Per sincronizzare tutto ciò, è necessario riavviare il servizio mysql.
Manoj Kumar G,

0

Inserisci un record fittizio in uno dei tuoi database con un timestamp Seleziona quel record e ottieni il valore del timestamp. Elimina quel record. Ottiene sicuramente il fuso orario utilizzato dal server per scrivere i dati e ignora i fusi orari PHP.


0

Puoi provare quanto segue:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Qui puoi specificare la differenza di tempo in secondi


1
non è necessario aggiungere e sottrarre offset. con la luce del giorno che dice regole ecc. è un campo minato
eweb

0

Utilizzare LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')per ottenere un valore nel formato del fuso orario di MySQL che è possibile utilizzare comodamente CONVERT_TZ(). Si noti che l'offset del fuso orario che si ottiene è valido solo nel momento in cui viene valutata l'espressione poiché l'offset può cambiare nel tempo se si ha l'ora legale. Tuttavia l'espressione è utile insieme NOW()a memorizzare l'offset con l'ora locale, il che chiarisce ciò che NOW()produce. (Nei fusi orari DST, NOW()salta indietro di un'ora una volta all'anno, quindi ha alcuni valori duplicati per punti distinti nel tempo).


0

Può essere

select timediff(current_time(),utc_time())

Non otterrai il valore del fuso orario direttamente in questo modo.

@@global.time_zonenon può essere utilizzato in quanto è una variabile e restituisce il valore 'SYSTEM'.

Se è necessario utilizzare la query in una sessione con un fuso orario modificato utilizzando session SET TIME_ZONE =, lo si otterrà con @@session.time_zone. Se fai una query @@global.time_zone, allora ottieni 'SYSTEM'.

Se provi datediff, date_subo timediffcon now()e utc_time(), allora probabilmente incontrerai problemi di conversione.

Ma le cose suggerite sopra probabilmente funzioneranno almeno con alcune versioni del server. La mia versione è 5.5.43-37 ed è una soluzione ospitata.


Questo non risponde chiaramente alla domanda. Forse puoi modificarlo per concentrarti sulla domanda posta.
Mogsdad,

-3

Prova a utilizzare il seguente codice:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.