Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comportamento aritmético de tempo php/Mysql desconcertante


É porque você está fazendo uma conversão implícita de um mysql datetime para um inteiro.

Por exemplo. mysql pensa que o tempo (enquanto escrevo isso) é 2011-12-15 13:42:10 mas se eu pedisse ao mysql para subtrair 90 disso, ele treinaria 20111215134210 - 90 =20111215134120 que é 13:41:20 que é 50 segundos atrás.

Trate a hora como um inteiro (convertendo de/para um timestamp unix, como sugerido por licorvicar) ou use as funções de data para fazer contas em um valor de data:
SELECT *, 
timediff(NOW(), attempt_time) diff, 
timediff(NOW(), attempt_time + INTERVAL 90 SECONDS) pending,
NOW() nw 
FROM failed_login 
WHERE (username = 'some_username' 
     OR attempt_ip = '127.0.0.1') 
AND NOW() - INTERVAL 90 SECONDS > attempt_time;

(observe que também reescrevi a última expressão de filtro de modo que a coluna da tabela fique isolada em um lado da expressão - o que tem um pequeno benefício de velocidade quando a coluna não é indexada, mas um grande benefício quando é indexada).

Ou usando segundos desde a época ....
SELECT *, 
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) diff, 
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) + 90 pending,
NOW() nw 
FROM failed_login 
WHERE (username = 'some_username' 
     OR attempt_ip = '127.0.0.1') 
AND UNIX_TIMESTAMP(NOW()) - 90 > UNIX_TIMESTAMP(attempt_time);

(que obviamente não poderá usar a otimização de índice).