sql >> Databasteknik >  >> RDS >> Mysql

Förbryllande php/Mysql Time aritmetiska beteende

Det beror på att du gör en implicit cast från en mysql datetime till ett heltal.

T.ex. mysql tror att tiden (när jag skriver detta) är 2011-12-15 13:42:10 men om jag bad mysql att subtrahera 90 från detta, skulle det träna 20111215134210 - 90 =20111215134120 vilket är 5:13:vilket är 5:13:sekunder sedan.

Behandla tiden som ett heltal (genom att konvertera till/från en unix-tidsstämpel, enligt förslaget av liquorvicar) eller använd datumfunktionerna för att räkna ut ett datumvärde:

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;

(observera att jag också har skrivit om det sista filteruttrycket så att tabellkolumnen är isolerad på ena sidan av uttrycket - vilket har en liten hastighetsfördel när kolumnen inte är indexerad men en enorm fördel när den är indexerad).

Eller med sekunder-sedan-epok...

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

(som uppenbarligen inte kommer att kunna använda indexoptimering).



  1. 6 problemfrågor som kraftigt saktar ner din databas

  2. Skapa MySQL lagrad procedur med JPA Hibernate

  3. Introduktion till PL/SQL-funktioner i Oracle Database

  4. Mysql Ingen anslutning kunde göras eftersom målmaskinen aktivt vägrade det