¿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_zone
uso, está bien, podemos involucrarnos PHP
aquí, siempre que pueda obtener información válida no como SYSTEM
...
@@system_time_zone
como se indica en mi respuesta a continuación.Respuestas:
Del manual ( sección 9.6 ):
Editar Lo anterior se devuelve
SYSTEM
si 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 esSYSTEM
, puede preguntarle al sistema qué zona horaria está utilizando a través dedate_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:
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:
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 valor
2009-11-01 01:30:00
en 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 necesariofuente
DATETIME
tipo 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 usarCONVERT_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.now()
PHP?La consulta a continuación devuelve la zona horaria de la sesión actual.
fuente
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
es más simpleSELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
para obtener la diferencia en segundos.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.
fuente
Como Jakub Vrána (El creador o Administrador y NotORM ) menciona en los comentarios, para seleccionar el desplazamiento de zona horaria actual en
TIME
uso:Volverá:
02:00:00
si su zona horaria es +2: 00 para esa fechaHice una hoja de trucos aquí: ¿MySQL debería tener su zona horaria establecida en UTC?
fuente
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
para obtener la diferencia en segundos.02:00:00
, la TIMESTAMPDIFF correspondiente volverían-2
si la unidad es la hora,-120
si 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 espera120
de 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_zonePara obtener la zona horaria actual de mysql, puede hacer lo siguiente:
Ahora, si desea cambiar la zona horaria mysql, entonces:
fuente
Esto devolverá la zona horaria como un número entero (por ejemplo
-6
:), manejando tiempos positivos o negativos (aquí es dondeEXTRACT
entra en juego: laHOUR
función sola devuelve zonas horarias negativas como positivas).fuente
Para cualquiera que venga a buscar la zona horaria de mysql db.
Con esta consulta puede obtener la zona horaria actual:
fuente
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
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 ().
fuente
Consulte el Soporte de zona horaria del servidor MySQL y la
system_time_zone
variable del sistema. ¿Eso ayuda?fuente
Mi framework PHP usa
encendido después de conectar, donde 'Cualquiera' == date_default_timezone_get ()
No es mi solución, pero esto garantiza que la
SYSTEM
zona horaria del servidor MySQL sea siempre la misma que la de PHP.Entonces, sí, PHP está fuertemente involucrado y puede afectarlo
fuente
Para obtener la hora actual de acuerdo con su zona horaria, puede usar lo siguiente (en mi caso, '+5: 30')
fuente
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.
fuente
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.
fuente
Puedes probar lo siguiente:
Aquí puede especificar su diferencia horaria en segundos
fuente
Ú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ómodamenteCONVERT_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 conNOW()
almacenar el desplazamiento con la hora local, que desambigua lo queNOW()
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).fuente
Puede ser
No obtendrá el valor de zona horaria directamente de esta manera.
@@global.time_zone
no 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_sub
otimediff
connow()
yutc_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.
fuente
Intenta usar el siguiente código:
fuente