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


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

UPDATE

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 no puede saber exactamente el time_zone utilizado,eso está bien, podemos involucrar PHP aquí, siempre y cuando pueda obtener información válida no como SYSTEM...

Author: hlopetz, 2010-05-29

16 answers

Del manual ( sección 9.6):

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

Edit Lo anterior devuelve SYSTEM si MySQL está configurado como esclavo de la zona horaria del sistema, lo cual es menos que útil. Dado que está usando PHP, si la respuesta de MySQL es SYSTEM, puede preguntar al sistema qué zona horaria está usando vía date_default_timezone_get. (Por supuesto, como señaló VolkerK fuera, PHP puede estar ejecutándose en un servidor diferente, pero como se supone, suponiendo que el servidor web y el servidor de base de datos con el que está hablando están establecidos en [si no realmente en] la misma zona horaria no es un salto enorme.) Pero tenga cuidado de que (como con MySQL), puede establecer la zona horaria que usa PHP (date_default_timezone_set), lo que significa que puede reportar un valor diferente al que está usando el sistema operativo. Si usted está en control del código PHP, usted debe saber si usted está haciendo eso y ser Vale.

Pero toda la cuestión de qué zona horaria está usando el servidor MySQL puede ser tangente, porque preguntar al servidor en qué zona horaria está le dice absolutamente nada acerca de 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 establecer la zona horaria utilizada por su conexión así:

set time_zone = '+00:00';

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

Tenga en cuenta, sin embargo, que los valores de hora y fecha son no almacenados 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)

Así que conocer la zona horaria del servidor solo es importante en términos de funciones que obtienen la hora en este momento, como now(), unix_timestamp(), etc.; no le dice nada acerca de qué zona horaria son las fechas en los datos de la base de datos utilizar. Puede elegir asumir que se escribieron utilizando la zona horaria del servidor, pero esa suposición puede ser defectuosa. Para conocer la zona horaria de las fechas u horas almacenadas en los datos, debe asegurarse de que estén almacenadas con información de la zona horaria o (como yo) asegurarse de que siempre estén en GMT.

¿Por qué está suponiendo que los datos se escribieron utilizando la zona horaria del servidor defectuosa? Bueno, por un lado, los datos pueden haber sido escritos usando una conexión que establece una zona horaria diferente. El la base de datos puede haber sido movida 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 trasladado de Texas a California). Pero incluso si los datos están escritos en el servidor, con su zona horaria actual, sigue siendo ambiguo. El año pasado, en los Estados Unidos, el horario de verano se apagó a las 2:00 a. m. del 1 de noviembre. Supongamos que mi servidor está en California usando la zona horaria del Pacífico y tengo el valor 2009-11-01 01:30:00 en el base. ¿Cuándo fue? ¿Fue a la 1: 30 a. m. el 1 de noviembre PDT, o a la 1: 30 a. m. el 1 de noviembre PST (una hora más tarde)? No tienes forma de saberlo. Moraleja: Siempre almacene las fechas / horas en GMT (que no hace horario de verano) y conviértalas a la zona horaria deseada cuando sea necesario.

 173
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-29 09:08:53

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

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
 155
Author: JohnZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-15 22:48:54

Simplemente SELECT @@system_time_zone;

Devuelve 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);

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

 69
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-24 20:26:11

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

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

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

He hecho un cheatsheet aquí: ¿Debería MySQL tener su zona horaria establecida en UTC?

 48
Author: Timo Huovinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:59
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

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

 6
Author: Luca Fagioli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-07 19:38:33

Para obtener la zona horaria actual de mysql puede hacer las siguientes cosas:

  1. SELECCIONE @ @ system_time_zone; / / de esto puede obtener la zona horaria del sistema
  2. SELECCIONE IF (@@session.time_zone = 'SYSTEM', @ @ system_time_zone, @@session.time_zone) //Esto le dará zona horaria si la zona horaria del sistema es diferente de la zona horaria global

Ahora, si desea cambiar la zona horaria de mysql, entonces: 1. SET GLOBAL time_zone = '+00: 00 ' / / esto establecerá la zona horaria de mysql en UTC 2. ESTABLECER @@sesion.time_zone = "+00:00"; //de esta manera, puede chnage la zona horaria solo para su sesión particular

 4
Author: Abhinav bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 08:52:21

Seleccione sec_to_time( TIME_TO_SEC (curtime ()) + 48000); aquí puede especificar sus diferencias de tiempo como sec

 2
Author: Bala Kayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-20 06:24:34

Echa un vistazo Soporte de Zona horaria del Servidor MySQL y el system_time_zone variable del sistema. ¿Eso ayuda?

 2
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 23:33:48

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

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

 0
Author: Storm Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-12 19:49:36

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. Borra ese registro. Obtiene con seguridad la zona horaria que el servidor está utilizando para escribir datos e ignora las zonas horarias de PHP.

 0
Author: alee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-27 09:49:59

Mi framework PHP usa

SET LOCAL time_zone='Whatever'

Después de conectar, donde' Whatever ' = = date_default_timezone_get()

No es mi solución, pero esto asegura SYSTEM la zona horaria del servidor MySQL es siempre la misma que la de PHP

Así que, sí, PHP está fuertemente envuelto y puede afectarlo

 0
Author: vladkras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 07:24:37

Use LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),'%H:%i'),6,'+') para obtener un valor en el formato de zona horaria de MySQL que puede usar convenientemente con CONVERT_TZ(). Tenga en cuenta que el desplazamiento de zona horaria que obtiene solo es válido en el momento en el 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() para almacenar el desplazamiento con la hora local, lo que desambiguará lo que produce NOW (). (En zonas horarias 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).

 0
Author: rtc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-24 18:46:47

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

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

 0
Author: Sanjoy Kanrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-04 11:49:32

La mención del comando en la descripción devuelve "SYSTEM" que indica que toma 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). Así que usted puede 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, el UTC_TIMESTAMP devuelve la fecha y hora UTC actuales como un valor en 'AAAA-MM-DD HH:MM:SS' o AAAAMMDDHHMMSS.formato uuuuuu dependiendo del uso de la función, es decir, en un contexto de cadena o 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.formato 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 ().

 0
Author: FullStack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 13:44:48

Puede ser tan estúpido como esto

Select timediff (current_time (), utc_time ())

Como es todo mysql

No obtendrá directamente el valor de la zona horaria de esta manera, pero si no hubiera otra manera...

@@global.time_zone no se puede usar en view ya que es una variable-y devuelve un valor bastante inutilizable 'SYSTEM' ( no tengo por qué alguien se molestó con él)

Si necesita usar su consulta en una sesión con changed time_zone (by session SET TIME_ZONE =) obtener que con @@sesión.huso si consulta @ @ global.time_zone consigue 'SISTEMA' catch 22

Si intenta datediff, date_sub, o timediff con now() y utc_time (), probablemente se encontrará con problemas de conversión que se chown silenciosamente por un servidor

La peor documentación que he visto nunca mi no te ayuda tampoco.

Excelente trabajo, todo el mundo!

Pero el algo sugerido anteriormente probablemente funcionará al menos con algunas versiones de servidor como es la mía (5.5.43-37) solución alojada.

 -1
Author: dwaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-24 20:31:42

Intente 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
 -2
Author: Oscar Rojas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-30 19:21:46