Como obtenho o fuso horário atual do MySQL?

217

Alguém sabe se existe essa função no MySQL?

ATUALIZAR

Isso não gera nenhuma informação válida:

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

Ou talvez o próprio MySQL não saiba exatamente o time_zoneque é usado, tudo bem, podemos envolvê-lo PHPaqui, desde que eu possa obter informações válidas, não como SYSTEM...

user198729
fonte
3
"podemos envolver o PHP aqui" - e essa instância do php sempre estaria na mesma máquina que o servidor MySQL?
VolkerK
Sim, eles estarão na mesma máquina.
User198729
10
Tente @@system_time_zonecomo indicado na minha resposta abaixo.
Andrew
Como a pergunta foi feita, mais respostas foram adicionadas, talvez reconsidere a resposta aceita?
Timo Huovinen
1
Mesmo que o servidor MySQL e PHP estejam no mesmo servidor, eles podem pegar fusos horários diferentes com base em suas configurações. E esses horários podem diferir do que o seu sistema operacional mostra e do PHP / MySQL.
Bimal Poudel

Respostas:

227

No manual ( seção 9.6 ):

Os valores atuais dos fusos horários globais e específicos do cliente podem ser recuperados assim:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Editar O retorno acima SYSTEMse o MySQL estiver definido como escravo do fuso horário do sistema, o que é menos que útil. Como você está usando PHP, se a resposta do MySQL for SYSTEM, você pode perguntar ao sistema que fuso horário está usando date_default_timezone_get. (Claro que, como VolkerK apontou, PHP pode ser executado em um servidor diferente, mas como hipóteses ir, assumindo que o servidor web eo servidor de DB que está falando está definido para [se não for realmente no ] o mesmo fuso horário não é um grande salto.) Mas cuidado com o fato de que (como no MySQL), você pode definir o fuso horário que o PHP usa (date_default_timezone_set), o que significa que ele pode relatar um valor diferente do que o sistema operacional está usando. Se você está no controle do código PHP, deve saber se está fazendo isso e ficar bem.

Mas toda a questão de qual fuso horário o servidor MySQL está usando pode ser uma tangente, porque perguntar ao servidor em que fuso horário está localizado não diz absolutamente nada sobre os dados no banco de dados. Leia para obter detalhes:

Discussão adicional :

Se você está no controle do servidor, é claro que pode garantir que o fuso horário seja uma quantidade conhecida. Se você não estiver no controle do servidor, poderá definir o fuso horário usado por sua conexão desta maneira:

set time_zone = '+00:00';

Isso define o fuso horário como GMT, para que quaisquer operações adicionais (como now()) usem GMT.

Observe, porém, que os valores de hora e data não são armazenados com informações de fuso horário no 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)

Então, sabendo o fuso horário do servidor só é importante em termos de funções que ficam o tempo agora, como now(), unix_timestamp(), etc .; não informa nada sobre o fuso horário que as datas nos dados do banco de dados estão usando. Você pode optar por assumir que eles foram gravados usando o fuso horário do servidor, mas essa suposição pode ser falha. Para conhecer o fuso horário de quaisquer datas ou horários armazenados nos dados, você deve garantir que eles sejam armazenados com informações de fuso horário ou (como eu) garantir que eles estejam sempre no GMT.

Por que assumir que os dados foram gravados usando o fuso horário do servidor com defeito? Bem, por um lado, os dados podem ter sido gravados usando uma conexão que define um fuso horário diferente. O banco de dados pode ter sido movido de um servidor para outro, onde os servidores estavam em fusos horários diferentes (eu o encontrei quando herdei um banco de dados que foi movido do Texas para a Califórnia). Mas mesmo que os dados sejam gravados no servidor, com seu fuso horário atual, ainda são ambíguos. No ano passado, nos Estados Unidos, o horário de verão foi desativado às 02:00 de 1º de novembro. Suponha que meu servidor esteja na Califórnia usando o fuso horário do Pacífico e eu tenha o valor2009-11-01 01:30:00no banco de dados. Quando foi isso? Isso era 01:30 de 1 de novembro PDT ou 1:30 de 1 de novembro de PST (uma hora depois)? Você não tem absolutamente nenhuma maneira de saber. Moral: sempre armazene datas / horas no GMT (que não executa o horário de verão) e converta para o fuso horário desejado conforme / quando necessário.

TJ Crowder
fonte
5
@ user198729: Não faz sentido , embora não seja tão útil quanto eu esperava. O que isso significa é: pergunte ao sistema operacional, o MySQL está se esquivando disso.
TJ Crowder
Apenas curioso, por que precisamos definir o fuso horário e recuperá-lo? Esse tipo de derrota o propósito, não é? Quero dizer, gostaria de pedir ao MySQL o fuso horário, porque não sei a resposta. Talvez eu esteja confuso e tenha entendido errado. Alguém pode explicar?
Senthil 29/05
1
@Senthil O DATETIMEtipo mySQL não contém informações de fuso horário. Portanto, acho que a filosofia subjacente pretendida aqui é que o mySQL seja o mais fuso horário possível - o que significa que o usuário deve ficar com um fuso horário, UTC ou no fuso horário em que o servidor está, armazenar tudo nesse fuso horário e faça conversões no nível do aplicativo ou use CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) Pelo menos, é assim que eu sempre entendi como ele deve funcionar, observando as opções esparsas que o mySQL fornece neste campo.
Pekka
Obrigado, mas isso ainda não está resolvido ainda, como obtenho as informações de tz pelo resultado do now()PHP?
User198729
Eu concordo totalmente com a parte "manter um fuso horário ao salvar o carimbo de data / hora". Mas esse-> "..ou o fuso horário em que o servidor está .." como você descobre isso? Digamos que você salvou todos os valores de carimbo de data e hora como UTC. Mas o servidor está em outro fuso horário e você deseja mostrar os valores do carimbo de data / hora de acordo com esse fuso horário. Então, como você saberá em que fuso horário está o servidor? Só então você pode passar algum valor para CONVERT_TZ () para convertê-lo, certo?
Senthil
196

A consulta abaixo retorna o fuso horário da sessão atual.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
JohnZ
fonte
6
Esta é realmente a resposta certa, porque demonstra que 'SYSTEM' é reconhecido como um fuso horário na conversão, tornando-o totalmente suficiente para converter, por exemplo, NOW () em qualquer fuso horário.
Nilskp 3/10
5
Obrigado, usando isso eu era capaz de obter o formato que eu queria:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker
97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)é mais simples.
Jakub Vrána
3
Ou SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);para obter a diferença em segundos.
philfreo 14/09
106

Simplesmente SELECT @@system_time_zone;

Devoluções PST(ou o que for relevante para o seu sistema).

Se você está tentando determinar o fuso horário da sessão, pode usar esta consulta:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

O que retornará o fuso horário da sessão, se for diferente do fuso horário do sistema.

Andrew
fonte
6
A única desvantagem é que, se o fuso horário mudar devido às alterações do horário de verão, ele ainda informará o que foi "lembrado" no momento de iniciar o servidor, consulte o bug do mysql 9518
Marque
72

Como Jakub Vrána (O criador ou Adminer e NotORM ) menciona nos comentários, para selecionar o deslocamento do fuso horário atual em TIMEuso:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Ele retornará: 02:00:00se o seu fuso horário for +2: 00 para essa data

Fiz uma planilha aqui: O MySQL deve ter seu fuso horário definido como UTC?

Timo Huovinen
fonte
Ou SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);para obter a diferença em segundos.
philfreo 14/09
complemento para @philfreo - observe que os parâmetros devem ser revertidos em TIMESTAMPDIFF em comparação com TIMEDIFF. Para dar o exemplo dado nesta resposta, se TIMEDIFF retornar 02:00:00, o TIMESTAMPDIFF correspondente retornaria -2se a unidade for HOUR, -120se a unidade for MINUTE, etc. Para obter o sinal correspondente ao fuso horário, troque os parâmetros: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())retornará o esperado 120para o fuso horário +2: 00. A razão para especificar minutos, é que existem alguns fusos horários que são 30 ou 45 minutos de deslocamento, ver en.wikipedia.org/wiki/Time_zone
ToolmakerSteve
1
esta é uma resposta muito melhor do que a resposta aceita, pois responde diretamente à pergunta e fornece uma solução em vez de apenas teoria.
supersan
10

Para obter o fuso horário atual do mysql, você pode fazer o seguinte:

 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

Agora, se você deseja alterar o fuso horário do mysql, então:

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

Isso retornará o fuso horário como um número inteiro (por exemplo -6:), manipulando tempos positivos ou negativos (aqui é onde EXTRACTentra em jogo: a HOURfunção sozinha retorna os fusos horários negativos como positivos).

Luca Fagioli
fonte
6

Para qualquer um que venha encontrar o fuso horário do mysql db.

Com esta consulta, você pode obter o fuso horário atual:

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

A menção de comando na descrição retorna "SYSTEM", indicando que leva o fuso horário do servidor. O que não é útil para nossa consulta.

A consulta a seguir ajudará a entender o fuso horário

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

A consulta acima fornecerá o intervalo de tempo em relação ao Tempo Universal Coordenado (UTC). Assim, você pode analisar facilmente o fuso horário. se o fuso horário do banco de dados for IST, a saída será 5:30

UTC_TIMESTAMP

No MySQL, o UTC_TIMESTAMP retorna a data e hora UTC atuais como um valor no formato 'AAAA-MM-DD HH: MM: SS' ou AAAAMMDDHHMMSS.uuuuuu, dependendo do uso da função, ou seja, em um contexto de seqüência de caracteres ou numérico.

AGORA()

Função NOW (). O MySQL NOW () retorna o valor da data e hora atuais no formato 'AAAA-MM-DD HH: MM: SS' ou no formato AAAAMMDDHHMMSS.uuuuuu, dependendo do contexto (numérico ou string) da função. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () são sinônimos de NOW ().

Amitesh
fonte
2

Confira Suporte ao fuso horário do servidor MySQL e a system_time_zonevariável do sistema. Isso ajuda?

Pekka
fonte
@user, você pode explicar em sua pergunta quais informações você está procurando exatamente (o fuso horário do servidor? O cliente?) e quais ferramentas estão à sua disposição? Você menciona PHP. Você pode acessar a linha de comando?
Pekka
5
@ usuário também, acho que você se depara com um pouco de respostas negativas de pessoas que estão tentando ser úteis, e não exatamente erradas. Não me importo com o voto nem a perda de opinião, mas sua atitude não é exatamente encorajadora a procurar mais uma solução.
Pekka
3
@ usuário, como eu disse, sua atitude não está me motivando a pesquisar mais respostas para você, especialmente à luz das poucas informações que você fornecer. Desculpe.
Pekka
3
@ user198729: Uau, perca a atitude. Pekka é o tipo de cara que realmente ajuda as pessoas. Se a cortesia por si só não for suficiente para motivá-lo, tente o interesse próprio.
TJ Crowder
2
Apenas meus pensamentos: eu não teria me ofendido se o usuário tivesse feito a mesma coisa na minha postagem. Quero dizer, a pressão do prazo ou a frustração adicionam algumas arestas às pessoas, mas acho que devemos permitir isso até certo ponto. Talvez eu esteja perdoando demais: |
Senthil
1

Minha estrutura PHP usa

SET LOCAL time_zone='Whatever'

após a conexão, onde 'Whatever' == date_default_timezone_get ()

Não é a minha solução, mas isso garante SYSTEM fuso horário do servidor MySQL seja sempre o mesmo que o do PHP

Então, sim, o PHP está fortemente envolvido e pode afetá-lo

vladkras
fonte
1

Para obter a hora atual de acordo com seu fuso horário, você pode usar o seguinte (no meu caso, é '+5: 30')

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

Sanjoy Kanrar
fonte
0

Você só precisa reiniciar o mysqld após alterar o fuso horário do System ..

O fuso horário global do MySQL leva o fuso horário do System. Quando você altera qualquer atributo do sistema, basta reiniciar o Mysqld.

Storm Young
fonte
após alterar o fuso horário no sistema operacional, as inserções do mysql usarão o novo fuso horário, mas selecione now (); e selecione current_timestamp; Os comandos ainda usarão o fuso horário antigo. Para sincronizar tudo isso, o serviço mysql deve ser reiniciado.
Manoj Kumar G
0

Inserir um registro fictício em um de seus bancos de dados com um registro de data e hora Selecione esse registro e obtenha o valor do registro de data e hora. Exclua esse registro. Obtém com certeza o fuso horário que o servidor está usando para gravar dados e ignora os fusos horários do PHP.

alee
fonte
0

Você pode tentar o seguinte:

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

Aqui você pode especificar sua diferença de tempo como segundos

Bala Kayan
fonte
1
você não deve adicionar e subtrair compensações. com a luz do dia dizendo regras etc é um campo minado
eweb 02/04
0

Use LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')para obter um valor no formato de fuso horário do MySQL com o qual você possa usar convenientemente CONVERT_TZ(). Observe que o deslocamento do fuso horário obtido é válido apenas no momento em que a expressão é avaliada, pois o deslocamento pode mudar ao longo do tempo se você tiver um horário de verão. No entanto, a expressão é útil juntamente com NOW()para armazenar o deslocamento com a hora local, o que desambigua o que NOW()produz. (Nos fusos horários do horário de verão, NOW()retrocede uma hora uma vez por ano, portanto, possui alguns valores duplicados para pontos distintos no tempo).

rtc
fonte
0

Pode ser

select timediff(current_time(),utc_time())

Você não receberá o valor do fuso horário diretamente dessa maneira.

@@global.time_zone não pode ser usado, pois é uma variável e retorna o valor 'SYSTEM' .

Se você precisar usar sua consulta em uma sessão com um fuso horário alterado, use session SET TIME_ZONE =isso com @@session.time_zone. Se você consultar @@global.time_zone, você recebe 'SYSTEM'.

Se você tentar datediff, date_subou timediffcom now()e utc_time(), provavelmente encontrará problemas de conversão.

Mas as coisas sugeridas acima provavelmente funcionarão pelo menos com algumas versões de servidor. Minha versão é 5.5.43-37 e é uma solução hospedada.

dwaid
fonte
Isso não responde claramente à pergunta. Talvez você possa editá- lo para focar na pergunta.
Mogdad
-3

Tente usar o seguinte 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
fonte