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

Forvirrende php/Mysql Time aritmetisk adfærd

Det er fordi du laver en implicit cast fra en mysql datetime til et heltal.

For eksempel. mysql mener, at tiden (som jeg skriver dette) er 2011-12-15 13:42:10, men hvis jeg bad mysql om at trække 90 fra dette, ville det træne 20111215134210 - 90 =20111215134120, hvilket er 5:13:sekunder siden.

Behandl enten tiden som et heltal (ved at konvertere til/fra et unix-tidsstempel, som foreslået af liquorvicar) eller brug datofunktionerne til at lave matematik på en datoværdi:

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;
 

(bemærk, at jeg også har omskrevet det sidste filterudtryk, så tabelkolonnen er isoleret på den ene side af udtrykket - hvilket har en lille hastighedsfordel, når kolonnen ikke er indekseret, men en kæmpe fordel, når den er indekseret).

Eller ved at bruge sekunder-siden-epoken...

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 naturligvis ikke vil kunne bruge indeksoptimering).



  1. Hvordan påvirker {} en MySQL-forespørgsel i PHP?

  2. Advarsel:mysqli_num_rows() forventer præcis 1 parameter, 2 givet | mysql |mysqli

  3. Forstå Lob-segmenter (SYS_LOB) i Oracle?

  4. MaxScale Basic Management ved hjælp af MaxCtrl til MariaDB Cluster