¿Cómo obtengo la zona horaria actual de MySQL?

217

¿Alguien sabe si existe tal función en MySQL?

ACTUALIZAR

Esto no genera ninguna información válida:

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

O tal vez MySQL en sí no puede saber exactamente el time_zoneuso, está bien, podemos involucrarnos PHPaquí, siempre que pueda obtener información válida no como SYSTEM...

usuario198729
fuente
3
"podemos involucrar a PHP aquí", ¿y esa instancia de php siempre estaría en la misma máquina que el servidor MySQL?
VolkerK
Sí, estarán en la misma máquina.
user198729
10
Intente @@system_time_zonecomo se indica en mi respuesta a continuación.
Andrew
Dado que se hizo la pregunta, se agregaron más respuestas, ¿quizás reconsiderar la respuesta aceptada?
Timo Huovinen
1
Aunque el servidor MySQL y PHP están en el mismo servidor, pueden elegir diferentes zonas horarias en función de su configuración. Y estos tiempos pueden diferir de lo que muestra su sistema operativo y de PHP / MySQL.
Bimal Poudel

Respuestas:

227

Del manual ( sección 9.6 ):

Los valores actuales de las zonas horarias globales y específicas del cliente pueden recuperarse así:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Editar Lo anterior se devuelve SYSTEMsi MySQL está configurado como esclavo de la zona horaria del sistema, lo que no es útil. Como está utilizando PHP, si la respuesta de MySQL es SYSTEM, puede preguntarle al sistema qué zona horaria está utilizando a través de date_default_timezone_get. (Por supuesto, como señaló VolkerK, PHP puede estar ejecutándose en un servidor diferente, pero según los supuestos, suponiendo que el servidor web y el servidor DB con el que está hablando están configurados en [si no está realmente en ] la misma zona horaria no es un gran salto.) Pero cuidado (como con MySQL), puedes configurar la zona horaria que usa PHP (date_default_timezone_set), lo que significa que puede informar un valor diferente al que usa el sistema operativo. Si tienes el control del código PHP, debes saber si lo estás haciendo y estar bien.

Pero toda la cuestión de qué zona horaria está usando el servidor MySQL puede ser tangente, porque preguntarle al servidor en qué zona horaria se encuentra le dice absolutamente nada sobre los datos en la base de datos. Siga leyendo para más detalles:

Discusión adicional :

Si tiene el control del servidor, por supuesto, puede asegurarse de que la zona horaria sea una cantidad conocida. Si no tiene el control del servidor, puede configurar la zona horaria utilizada por su conexión de esta manera:

set time_zone = '+00:00';

Eso establece la zona horaria en GMT, de modo que cualquier otra operación (como now()) usará GMT.

Sin embargo, tenga en cuenta que los valores de hora y fecha no se almacenan con información de zona horaria en 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)

Por lo que conocer la zona horaria del servidor sólo es importante en términos de funciones que hacen que el tiempo en este momento, como por ejemplo now(), unix_timestamp(), etc .; no le dice nada sobre qué zona horaria están usando las fechas en los datos de la base de datos. Puede optar por suponer que se escribieron utilizando la zona horaria del servidor, pero esa suposición puede ser errónea. Para conocer la zona horaria de cualquier fecha u hora almacenada en los datos, debe asegurarse de que estén almacenados con información de la zona horaria o (como lo hago yo) asegurarse de que siempre estén en GMT.

¿Por qué se supone que los datos se escribieron usando la zona horaria del servidor defectuosa? Bueno, para empezar, los datos pueden haberse escrito utilizando una conexión que establece una zona horaria diferente. La base de datos puede haberse movido de un servidor a otro, donde los servidores estaban en diferentes zonas horarias (me encontré con eso cuando heredé una base de datos que se había mudado de Texas a California). Pero incluso si los datos se escriben en el servidor, con su zona horaria actual, siguen siendo ambiguos. El año pasado, en los Estados Unidos, el horario de verano se apagó a las 2:00 am del 1 de noviembre. Supongamos que mi servidor está en California usando la zona horaria del Pacífico y tengo el valor2009-11-01 01:30:00en la base de datos. ¿Cuando fue? ¿Era la 1:30 am del 1 de noviembre PDT o la 1:30 am del 1 de noviembre PST (una hora después)? No tienes absolutamente ninguna forma de saberlo. Moraleja: siempre almacene fechas / horas en GMT (que no hace DST) y convierta a la zona horaria deseada cuando sea necesario

TJ Crowder
fuente
55
@ user198729: No tiene sentido , aunque no es tan útil como esperaba. Lo que significa es: Pregúntele al sistema operativo, MySQL está esclavizado por eso.
TJ Crowder
Solo por curiosidad, ¿por qué tenemos que establecer la zona horaria nosotros mismos y luego recuperarla? Ese tipo de derrotas el propósito, ¿no? Quiero decir, me gustaría preguntarle a MySQL por la zona horaria porque no sé la respuesta. Tal vez estoy confundido y me equivoqué. Alguien puede explicar?
Senthil
1
@Senthil El DATETIMEtipo mySQL no contiene información de zona horaria. Por lo tanto, creo que la filosofía subyacente prevista aquí es que mySQL sea lo más ciego posible a la zona horaria, lo que significa que el usuario debe seguir con una zona horaria, UTC o la zona horaria en la que se encuentra el servidor, almacenar todo en esa zona y hacer cualquier conversión a nivel de aplicación o usar CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) Al menos, así es como siempre entendí cómo se supone que debe funcionar, mirando las opciones dispersas que mySQL proporciona en este campo.
Pekka
Gracias pero esto aún no está resuelto, ¿cómo obtengo la información tz por el resultado de now()PHP?
user198729
Estoy totalmente de acuerdo con la parte "pegarme a una zona horaria al guardar la marca de tiempo" ... Pero esto-> "... o la zona horaria en la que se encuentra el servidor ..." ¿cómo lo descubriste? Digamos que guardó todos los valores de marca de tiempo como UTC. Pero su servidor se encuentra en otra zona horaria y desea mostrar los valores de marca de hora de acuerdo con esa zona horaria. Entonces, ¿cómo sabrá en qué zona horaria se encuentra su servidor? Solo entonces puede pasar algún valor a CONVERT_TZ () para convertirlo ¿no?
Senthil
196

La consulta a continuación devuelve la zona horaria de la sesión actual.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
JohnZ
fuente
66
Esta es realmente la respuesta correcta, porque demuestra que 'SYSTEM' se reconoce como una zona horaria en la conversión, por lo que es completamente suficiente para convertir, por ejemplo, NOW () en cualquier zona horaria.
nilskp
55
Gracias, usando esto pude obtener el formato que quería:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker
97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)es más simple
Jakub Vrána
3
O SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);para obtener la diferencia en segundos.
philfreo
106

Simplemente SELECT @@system_time_zone;

Devoluciones PST(o lo que sea relevante para su sistema).

Si está tratando de determinar la zona horaria de la sesión, puede usar esta consulta:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Lo que devolverá la zona horaria de la sesión si difiere de la zona horaria del sistema.

Andrés
fuente
66
El único inconveniente es que si la zona horaria cambia debido a los cambios en el horario de verano, todavía informará la que fue "recordada" al momento de iniciar el servidor, vea mysql bug 9518
Marque
72

Como Jakub Vrána (El creador o Administrador y NotORM ) menciona en los comentarios, para seleccionar el desplazamiento de zona horaria actual en TIMEuso:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Volverá: 02:00:00si su zona horaria es +2: 00 para esa fecha

Hice una hoja de trucos aquí: ¿MySQL debería tener su zona horaria establecida en UTC?

Timo Huovinen
fuente
O SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);para obtener la diferencia en segundos.
philfreo
complemento a @philfreo: tenga en cuenta que los parámetros deben invertirse en TIMESTAMPDIFF en comparación con TIMEDIFF. Para tomar el ejemplo dado en esta respuesta, si los rendimientos TIMEDIFF 02:00:00, la TIMESTAMPDIFF correspondiente volverían -2si la unidad es la hora, -120si la unidad es MINUTO, etc. Para obtener la señal para que corresponda a la zona horaria, cambie los parámetros: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())devolverá la espera 120de zona horaria +2: 00. La razón para especificar minutos, es que hay algunas zonas horarias que tienen un desplazamiento de 30 o 45 minutos, consulte en.wikipedia.org/wiki/Time_zone
ToolmakerSteve
1
Esta es una respuesta mucho mejor que la respuesta aceptada, ya que responde la pregunta directamente y da una solución en lugar de solo una teoría.
supersan
10

Para obtener la zona horaria actual de mysql, puede hacer lo siguiente:

 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

Ahora, si desea cambiar la zona horaria mysql, entonces:

 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 
Abhinav bhardwaj
fuente
6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Esto devolverá la zona horaria como un número entero (por ejemplo -6:), manejando tiempos positivos o negativos (aquí es donde EXTRACTentra en juego: la HOURfunción sola devuelve zonas horarias negativas como positivas).

Luca Fagioli
fuente
6

Para cualquiera que venga a buscar la zona horaria de mysql db.

Con esta consulta puede obtener la zona horaria actual:

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

El comando mencionado en la descripción devuelve "SYSTEM", que indica que ocupa la zona horaria del servidor. Lo cual no es útil para nuestra consulta.

La siguiente consulta ayudará a comprender la zona horaria

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

La consulta anterior le dará el intervalo de tiempo con respecto al Tiempo Universal Coordinado (UTC). Para que pueda analizar fácilmente la zona horaria. si la zona horaria de la base de datos es IST, la salida será 5:30

UTC_TIMESTAMP

En MySQL, UTC_TIMESTAMP devuelve la fecha y hora UTC actual como un valor en formato 'AAAA-MM-DD HH: MM: SS' o AAAAMMDDHHMMSS.uuuuuu dependiendo del uso de la función, es decir, en una cadena o contexto numérico.

AHORA()

Función NOW (). MySQL NOW () devuelve el valor de la fecha y hora actuales en formato 'AAAA-MM-DD HH: MM: SS' o AAAAMMDDHHMMSS.uuuuuu dependiendo del contexto (numérico o cadena) de la función. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () son sinónimos de NOW ().

Amitesh
fuente
2

Consulte el Soporte de zona horaria del servidor MySQL y la system_time_zonevariable del sistema. ¿Eso ayuda?

Pekka
fuente
@usuario, ¿puede explicar en su pregunta qué información está buscando exactamente (la zona horaria del servidor? El cliente?) y qué herramientas están a su disposición? Mencionas PHP. ¿Se puede acceder a la línea de comando?
Pekka
55
@user también, creo que te encuentras como un idiota que rechaza las respuestas de personas que intentan ser útiles, y no exactamente incorrectas. No me importa el voto ni la pérdida de puntos, pero su actitud no es exactamente alentadora para buscar una solución.
Pekka
3
@user, como dije, su actitud no me motiva a buscar nuevas respuestas para usted, especialmente a la luz de la escasa información que proporciona. Lo siento.
Pekka
3
@ user198729: Wow, pierde la actitud. Pekka es el tipo de persona que realmente ayuda a la gente. Si la cortesía por sí sola no es suficiente para motivarte, prueba el interés propio.
TJ Crowder
2
Solo mis pensamientos: no me habría ofendido si el usuario hubiera hecho lo mismo con mi publicación. Quiero decir, la presión o la frustración en la fecha límite agrega algunas asperezas alrededor de las personas, pero creo que deberíamos permitirlo hasta cierto punto. Tal vez soy demasiado indulgente: |
Senthil
1

Mi framework PHP usa

SET LOCAL time_zone='Whatever'

encendido después de conectar, donde 'Cualquiera' == date_default_timezone_get ()

No es mi solución, pero esto garantiza que la SYSTEMzona horaria del servidor MySQL sea siempre la misma que la de PHP.

Entonces, sí, PHP está fuertemente involucrado y puede afectarlo

vladkras
fuente
1

Para obtener la hora actual de acuerdo con su zona horaria, puede usar lo siguiente (en mi caso, '+5: 30')

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

Sanjoy Kanrar
fuente
0

Solo necesita reiniciar mysqld después de alterar la zona horaria del sistema.

La zona horaria global de MySQL ocupa la zona horaria del sistema. Cuando cambia cualquiera de estos atributos del sistema, solo necesita reiniciar Mysqld.

Storm Young
fuente
después de cambiar la zona horaria en el sistema operativo, las inserciones de mysql usarán la nueva zona horaria pero seleccionarán ahora (); y seleccione current_timestamp; Los comandos seguirán utilizando la zona horaria anterior. Para sincronizar todo esto, el servicio mysql debe reiniciarse.
Manoj Kumar G
0

Inserte un registro ficticio en una de sus bases de datos que tenga una marca de tiempo Seleccione ese registro y obtenga el valor de la marca de tiempo. Eliminar ese registro. Obtiene con seguridad la zona horaria que utiliza el servidor para escribir datos e ignora las zonas horarias de PHP.

alee
fuente
0

Puedes probar lo siguiente:

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

Aquí puede especificar su diferencia horaria en segundos

Bala Kayan
fuente
1
No debe sumar ni restar compensaciones. con la luz del día diciendo reglas, etc., es un campo minado
eweb
0

Úselo LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')para obtener un valor en el formato de zona horaria de MySQL con el que pueda usar cómodamente CONVERT_TZ(). Tenga en cuenta que el desplazamiento de la zona horaria que obtiene solo es válido en el momento en que se evalúa la expresión, ya que el desplazamiento puede cambiar con el tiempo si tiene horario de verano. Sin embargo, la expresión es útil junto con NOW()almacenar el desplazamiento con la hora local, que desambigua lo que NOW()produce. (En las zonas horarias del horario de verano, NOW()retrocede una hora una vez al año, por lo que tiene algunos valores duplicados para distintos puntos en el tiempo).

rtc
fuente
0

Puede ser

select timediff(current_time(),utc_time())

No obtendrá el valor de zona horaria directamente de esta manera.

@@global.time_zoneno se puede usar ya que es una variable y devuelve el valor 'SYSTEM'.

Si necesita usar su consulta en una sesión con una zona horaria modificada session SET TIME_ZONE =, entonces la obtendrá con @@session.time_zone. Si consultas @@global.time_zone, entonces obtienes 'SYSTEM'.

Si lo intentas datediff, date_subo timediffcon now()y utc_time(), entonces probablemente te encuentres con problemas de conversión.

Pero las cosas sugeridas anteriormente probablemente funcionarán al menos con algunas versiones de servidor. Mi versión es 5.5.43-37 y es una solución alojada.

dwaid
fuente
Esto no responde claramente la pregunta. Quizás pueda editarlo para centrarse en la pregunta que se le hace.
Mogsdad
-3

Intenta usar el siguiente código:

//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
Oscar Rojas
fuente