Estou tentando entender como comparar um valor DATETIME (ostensivamente inserido como GMT) e um valor TIMESTAMP (gerado automaticamente na hora INSERT).
Pelo que entendi, DATETIME é definido para o que for definido - e o relatório volta com o mesmo valor, não importa quais fusos horários estejam em vigor no servidor ou cliente.
Na documentação do MySQL, parece que os valores TIMESTAMP são relatados no fuso horário atual, mas armazenados em UTC.
Nessa situação, subtrair o valor DATETIME (evento anterior) do valor TIMESTAMP deve ser possível sem muita conversão de fuso horário - porque DATETIME é GMT e o valor TIMESTAMP é UTC. No entanto, fazer isso com precisão - e entendê-lo - está provando ser um problema.
Tenho situações em que preciso (DATETIME - TIMESTAMP)
em minutos e em dias. Se assumirmos que a coluna d
é DATETIME e a coluna t
é TIMESTAMP ... Até agora, tentei:
DATEDIFF(d,t)
TIMEDIFF(d,t)
UNIX_TIMESTAMP(d) - UNIX_TIMESTAMP(t) - 1800
(contabilizando o horário de verão)
Nosso fuso horário aqui é US Central Time - atualmente Central Daylight Time - GMT-6 para CST e GMT-5 para CDT atual.
Também parece que DATEDIFF converte ambos os valores em datas e os compara - em vez de comparar o tempo entre os valores e dividir pelo número de 24 horas em cada um. Assim, eu não acho que o DATEDIFF funcionará diretamente para mim de qualquer maneira.
As perguntas específicas, então, são:
- Como você compara um DATETIME em GMT com um valor TIMESTAMP? Especificamente, encontrar o número de minutos entre os dois, assumindo que o valor TIMESTAMP foi gerado por último.
- Qual é a melhor maneira de obter a diferença em slots de 24 horas entre os mesmos dois valores? Suponho que seria - usando A1 como resposta à pergunta acima -
TRUNCATE(A1 / (24.0 * 60.0))
...
UPDATE: Tentei usar a CONVERT_TZ
função com os valores de US/Central
e GMT
. No entanto, a CONVERT_TZ
função com tais especificações parece ler a configuração do horário de verão a partir da hora atual do sistema e não da hora lida no campo do banco de dados. Isso significa que quando os dados devem ser considerados como uma data no CST, eles são lidos como CDT.
Continuo pensando que deve ser simples obter a representação UTC de um campoTIMESTAMP
- o que simplificaria as coisas, me parece.
ATUALIZAÇÃO 2: Parece-me que eu falei errado sobre CONVERT_TZ
. Estou usando esta função e parece funcionar:
TIMEDIFF(CONVERT_TZ(t),'US/Central','UTC'),d)
Mesmo com uma mudança de fuso horário (de CST para CDT), parece funcionar ...
Existe uma página de manual sobre as funções de Hora e Data.
A melhor maneira de comparar data e hora e obter minutos de volta é provavelmente usar um dos seguintes:
Observe que, embora
TIMEDIFF
funcione com horas,TIMESTAMPDIFF
requer um componente de data - e os valores são alternados paraTIMESTAMPDIFF
.Você pode retornar horas com qualquer um destes:
Observe que ao usar
DATEDIFF
, o valor retornado é uma diferença entre os componentes de data de um determinado horário - assim, um valor de 23:59 em um dia comparado a um valor de 0:01 no próximo (uma diferença de 2 minutos) resulta em uma diferença de data de 1 (um dia inteiro).Para obter uma diferença entre duas vezes em períodos de 24 horas (duração de um dia), primeiro calcule a diferença em minutos e depois divida pelos valores apropriados para encontrar o número de períodos de 24 horas. Tente isto:
Isso trunca a parte decimal, retornando apenas o número de períodos completos de 24 horas no período de tempo especificado.