Come posso ottenere il fuso orario corrente di MySQL?

Qualcuno sa se c’è una tale funzione in MySQL?

AGGIORNARE

Questo non produce alcuna informazione valida:

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

O forse MySQL stesso non può sapere esattamente la time_zone utilizzata, va bene, possiamo coinvolgere PHP qui, finché posso ottenere informazioni valide non come SYSTEM

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 Il precedente ritorna SYSTEM se MySQL è impostato su slave per il fuso orario del sistema, che è meno che utile. Dato che stai usando PHP, se la risposta di MySQL è SYSTEM , puoi chiedere al sistema il fuso orario che usa tramite date_default_timezone_get . (Naturalmente, come ha sottolineato VolkerK, PHP potrebbe essere in esecuzione su un server diverso, ma come assunzioni, 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), è ansible impostare il fuso orario che PHP utilizza ( date_default_timezone_set ), il che significa che può segnalare un valore diverso da quello che il sistema operativo sta utilizzando. Se hai il controllo del codice PHP, dovresti sapere se lo stai facendo e stai bene.

Ma l’intera questione su quale fuso orario sta usando il server MySQL può essere una tangente, perché chiedendo al server quale fuso orario è presente non ti 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'; 

Questo imposta il fuso orario su GMT, in modo che qualsiasi operazione successiva (come now() ) utilizzi 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 conoscere il fuso orario del server è importante solo in termini di funzioni che ottengono il momento giusto, come now() , unix_timestamp() , ecc .; non ti dice nulla su quale fuso orario le date nei dati del database stanno usando. È ansible scegliere di presumere che siano stati scritti utilizzando il fuso orario del server, ma tale ipotesi potrebbe essere errata. Per conoscere il fuso orario di qualsiasi data o ora memorizzata nei dati, devi assicurarti che siano memorizzati con informazioni sul fuso orario o (come faccio io) assicurarti che siano sempre in GMT.

Perché si assume che i dati siano stati scritti utilizzando il fuso orario del server imperfetto? 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 all'altro, dove i server erano in diversi fusi orari (mi sono imbattuto in questo 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 corrente, è ancora ambiguo. L'anno scorso, negli Stati Uniti, l'ora legale è stata distriggersta alle 2:00 del 1 novembre. Supponiamo che il mio server sia in California utilizzando il fuso orario del Pacifico e che abbia il valore 2009-11-01 01:30:00 nel database. Quando era? Erano le 1:30 del 1 ° novembre PDT, o l'1:30 del 1 ° novembre del PST (un'ora più tardi)? Non hai assolutamente modo di saperlo. Morale: memorizza sempre le date / orari in GMT (che non esegue l'ora legale) e converti nel fuso orario desiderato come / quando necessario.

La query sottostante restituisce il fuso orario della sessione corrente.

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

Semplicemente SELECT @@system_time_zone;

Restituisce PST (o qualsiasi 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.

Come Jakub Vrána (Il creatore o Amministratore e NotORM ) menziona nei commenti, per selezionare l’attuale offset del fuso orario nell’uso del TIME :

 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

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

Ho fatto un cheatsheet qui: MySQL dovrebbe avere il suo fuso orario impostato su UTC?

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

Ciò restituirà il fuso orario come un numero intero (ad esempio: -6 ), gestendo i tempi positivi o negativi (qui è dove entra in gioco EXTRACT : la funzione HOUR restituisce i fusi orari negativi come positivi).

Per ottenere il fuso orario corrente di mysql puoi fare quanto segue:

  1. SELECT @@ system_time_zone; // da questo puoi ottenere il fuso orario del sistema
  2. SELEZIONA IF (@@ session.time_zone = ‘SYSTEM’, @@ system_time_zone, @@ session.time_zone) // Questo ti darà il fuso orario se il fuso orario del sistema è diverso dal fuso orario globale

Ora se vuoi cambiare il fuso orario mysql, allora: 1. SET GLOBAL time_zone = ‘+00: 00’ // questo imposterà il fuso orario mysql in UTC 2. SET @@ session.time_zone = “+00: 00”; // da questo puoi modificare il fuso orario solo per la tua sessione specifica

Controlla il supporto del fuso orario in mySQL e la variabile di sistema time_zone . Questo aiuta?

selezionare sec_to_time (TIME_TO_SEC (curtime ()) + 48000); qui puoi specificare i tuoi differenziali di orario in secondi

Hai solo bisogno di riavviare mysqld dopo aver modificato il fuso orario del sistema ..

Il fuso orario globale di MySQL richiede il fuso orario del sistema. Quando modifichi qualsiasi attributo di sistema, hai solo bisogno di riavviare Mysqld.

Inserisci un record fittizio in uno dei tuoi database che ha un timestamp Seleziona quel record e ottieni il valore del timestamp. Elimina quel record. Ottiene di sicuro il fuso orario che il server sta utilizzando per scrivere dati e ignora i fusi orari PHP.

Il mio framework PHP utilizza

 SET LOCAL time_zone='Whatever' 

on after connect, dove ‘Whatever’ == date_default_timezone_get ()

Non è la mia soluzione, ma ciò garantisce che il fuso orario SYSTEM del server MySQL sia sempre uguale a quello di PHP

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

Usa LPAD (TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP), ‘% H:% i’), 6, ‘+’) per ottenere un valore nel formato del fuso orario di MySQL che puoi usare comodamente con CONVERT_TZ (). Si noti che l’offset del fuso orario ottenuto è valido solo nel momento in cui viene valutata l’espressione, poiché l’offset può cambiare nel tempo se si dispone dell’ora legale. Tuttavia l’espressione è utile insieme a NOW () per memorizzare l’offset con l’ora locale, che disambigura ciò che NOW () produce. (Nei fusi orari dell’ora legale, NOW () torna indietro di un’ora ogni anno, quindi ha alcuni valori duplicati per punti distinti nel tempo).

Per ottenere l’ora corrente in base al fuso orario, è ansible utilizzare quanto segue (nel mio caso il ‘+5: 30’)

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

Potrebbe essere stupido come questo

seleziona timediff (current_time (), utc_time ())

come è intero mysql

non otterrai direttamente il valore del fuso orario in questo modo, ma se non ci fosse altro modo …

@@ global.time_zone non può essere utilizzato in vista in quanto è una variabile – e restituisce un valore abbastanza inutilizzabile ‘SYSTEM’ (non ho motivo per cui qualcuno si sia preso la briga di farlo)

se hai bisogno di usare la tua query in una sessione con fuso orario modificato (per sessione SET TIME_ZONE =) lo otterrai con @@ session.time_zone se richiedi @@ global.time_zone ottieni ‘SISTEMA’ cattura 22

se provi con datediff, date_sub o timediff con now () e utc_time () probabilmente ti imbatterai in problemi di conversione che vengono silenziosamente chown da un server

La peggiore documentazione che abbia mai visto, non ti aiuta nemmeno.

Ottimo lavoro, a tutti!

Ma il qualcosa sopra suggerito probabilmente funzionerà almeno con alcune versioni del server come la mia (5.5.43-37) soluzione ospitata.

Prova ad usare 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