Eu tenho um banco de dados com dois valores DATETIME e, a partir deles, gero alguns novos valores:
tdiff = timediff(d1,d2)+0
day1 = truncate(tdiff/60.0/60.0/24.0,0)
day2 = datediff(d1,d2)+0
Todas essas três "variáveis" são campos FLOAT no banco de dados (temporário). Eu esperaria isso day1
e day2
nunca diferiria em mais de 1 ou 2. No entanto, existem certos valores que parecem gerar uma resposta selvagem - e eles tendem a ser para certos valores de tdiff
. Calcular o valor de tdiff
mostra que os cálculos estão corretos.
Conceitualmente, day2 deve ser a diferença entre as datas dos valores DATETIME e day1 deve ser o número de períodos de 24 horas no mesmo período de tempo.
As maiores diferenças estão no valor máximo para timediff: usando cálculos, o número de períodos de 24 horas é pouco mais de 97. No entanto, usando a função DATEDIFF mostra um intervalo de tempo tão baixo quanto 60 dias. Isso não faz sentido.
Também há grandes diferenças quando TIMEDIFF resulta em 26 períodos de 24 horas: DATEDIFF relata 10 dias - ou quando TIMEDIFF resulta em 30 períodos de 24 horas e DATEDIFF relata 11 dias. Também há diferenças quando TIMEDIFF informa 79 dias, mas DATEDIFF fornece 29 dias.
Aqui está um exemplo de saída - de um script Ruby (e no formato de array Ruby) - com colunas d1,d2,TIMEDIFF,períodos de 24 horas,DATEDIFF:
["2012-04-11 06:15:21", "2012-02-09 22:11:21", "8.38596e+06", "97", "62"]
["2012-04-11 06:15:22", "2012-02-09 22:13:24", "8.38596e+06", "97", "62"]
["2012-04-11 06:15:25", "2012-02-09 22:15:29", "8.38596e+06", "97", "62"]
["2012-04-11 05:47:25", "2012-03-31 05:07:01", "2.64402e+06", "30", "11"]
["2012-04-11 05:47:26", "2012-03-31 05:09:03", "2.64382e+06", "30", "11"]
["2012-04-11 05:47:27", "2012-03-31 05:27:21", "2.64201e+06", "30", "11"]
["2012-04-11 05:48:43", "2012-01-27 16:39:32", "8.38596e+06", "97", "75"]
["2012-04-11 05:49:00", "2012-04-01 19:58:00", "2.2551e+06", "26", "10"]
["2012-04-11 05:49:00", "2012-04-01 20:00:02", "2.25486e+06", "26", "10"]
["2012-04-11 05:49:00", "2012-04-01 20:02:04", "2.25466e+06", "26", "10"]
["2012-04-11 05:49:05", "2012-04-01 20:04:04", "2.2545e+06", "26", "10"]
["2012-04-11 05:49:06", "2012-04-01 20:06:06", "2.2543e+06", "26", "10"]
["2012-04-11 05:49:06", "2012-01-27 17:36:07", "8.38596e+06", "97", "75"]
["2012-04-11 05:49:07", "2012-04-01 20:08:10", "2.25406e+06", "26", "10"]
["2012-04-11 06:15:06", "2012-03-13 12:23:24", "6.89514e+06", "79", "29"]
["2012-04-11 06:15:07", "2012-03-13 12:25:25", "6.89494e+06", "79", "29"]
Por que esses cálculos são tão diferentes? Estou assumindo que é uma falta de compreensão do TIMEDIFF, mas o que estou perdendo?
A resposta está em entender completamente a
TIMEDIFF
função e o que ela retorna como um número inteiro.Primeiro, vamos considerar
TIMEDIFF
em seu elemento nativo e o que ele retorna:Em segundo lugar, o que
TIMEDIFF
retorna em um contexto inteiro - feito adicionando zero:Agora, usamos a
TIME_TO_SEC
função para retornar o que realmente queremos:O valor inteiro retornado por
TIMEDIFF
não é minutos ou segundos, mas sim uma representação de base 10 do tempo real - então 01:00:00 se torna 10000 e 05:05:01 se torna 50501.Em vez de usar
TIME_TO_SEC
, pode-se também usarTIMESTAMPDIFF
em vez deTIMEDIFF
e definir as unidades para o que for desejado:Em vez de
MINUTE
, você também pode usarFRAC_SECOND
(microssegundos),SECOND
,MINUTE
,HOUR
,DAY
,WEEK
,MONTH
,QUARTER
ouYEAR
.As funções de tempo no MySQL (neste caso, versão 5.1) estão todas descritas no manual . O manual online também possui links para outras versões (como MySQL 5.5).