Mysql
 sql >> Database >  >> RDS >> Mysql

Comportamento aritmetico di php/Mysql Time sconcertante

È perché stai eseguendo un cast implicito da un mysql datetime a un intero.

Per esempio. mysql pensa che il tempo (mentre scrivo questo) sia 2011-12-15 13:42:10 ma se chiedessi a mysql di sottrarre 90 da questo, si allenerebbe 20111215134210 - 90 =20111215134120 che è 13:41:20 Che è 50 secondi fa.

Tratta l'ora come un numero intero (convertendo in/da un timestamp unix, come suggerito da liquorvicar) o usa le funzioni di data per fare calcoli su un valore di 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;

(nota che ho anche riscritto l'ultima espressione di filtro in modo tale che la colonna della tabella sia isolata su un lato dell'espressione, il che ha un piccolo vantaggio in termini di velocità quando la colonna non è indicizzata ma un enorme vantaggio quando è indicizzata).

O usando i secondi dall'epoca....

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);

(che ovviamente non potrà utilizzare l'ottimizzazione dell'indice).