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_zone
que é usado, tudo bem, podemos envolvê-lo PHP
aqui, desde que eu possa obter informações válidas, não como SYSTEM
...
@@system_time_zone
como indicado na minha resposta abaixo.Respostas:
No manual ( seção 9.6 ):
Editar O retorno acima
SYSTEM
se 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 forSYSTEM
, você pode perguntar ao sistema que fuso horário está usandodate_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:
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:
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 valor
2009-11-01 01:30:00
no 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.fonte
DATETIME
tipo 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 useCONVERT_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.now()
PHP?A consulta abaixo retorna o fuso horário da sessão atual.
fonte
select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
é mais simples.SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
para obter a diferença em segundos.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.
fonte
Como Jakub Vrána (O criador ou Adminer e NotORM ) menciona nos comentários, para selecionar o deslocamento do fuso horário atual em
TIME
uso:Ele retornará:
02:00:00
se o seu fuso horário for +2: 00 para essa dataFiz uma planilha aqui: O MySQL deve ter seu fuso horário definido como UTC?
fonte
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);
para obter a diferença em segundos.02:00:00
, o TIMESTAMPDIFF correspondente retornaria-2
se a unidade for HOUR,-120
se 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 esperado120
para 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_zonePara obter o fuso horário atual do mysql, você pode fazer o seguinte:
Agora, se você deseja alterar o fuso horário do mysql, então:
fonte
Isso retornará o fuso horário como um número inteiro (por exemplo
-6
:), manipulando tempos positivos ou negativos (aqui é ondeEXTRACT
entra em jogo: aHOUR
função sozinha retorna os fusos horários negativos como positivos).fonte
Para qualquer um que venha encontrar o fuso horário do mysql db.
Com esta consulta, você pode obter o fuso horário atual:
fonte
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
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 ().
fonte
Confira Suporte ao fuso horário do servidor MySQL e a
system_time_zone
variável do sistema. Isso ajuda?fonte
Minha estrutura PHP usa
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 PHPEntão, sim, o PHP está fortemente envolvido e pode afetá-lo
fonte
Para obter a hora atual de acordo com seu fuso horário, você pode usar o seguinte (no meu caso, é '+5: 30')
fonte
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.
fonte
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.
fonte
Você pode tentar o seguinte:
Aqui você pode especificar sua diferença de tempo como segundos
fonte
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 convenientementeCONVERT_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 comNOW()
para armazenar o deslocamento com a hora local, o que desambigua o queNOW()
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).fonte
Pode ser
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_sub
outimediff
comnow()
eutc_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.
fonte
Tente usar o seguinte código:
fonte