sql >> Database >  >> RDS >> Mysql

Verbijsterend php/Mysql Tijdrekenkundig gedrag

Het is omdat je een impliciete cast uitvoert van een mysql datetime naar een geheel getal.

bijv. mysql denkt dat de tijd (terwijl ik dit schrijf) 2011-12-15 13:42:10 is, maar als ik mysql zou vragen om 90 hiervan af te trekken, zou het een training zijn van 20111215134210 - 90 =20111215134120, wat 13:41:20 is, wat 50 is seconden geleden.

Behandel de tijd als een geheel getal (door te converteren naar/van een Unix-tijdstempel, zoals voorgesteld door Liquvicar) of gebruik de datumfuncties om wiskunde op een datumwaarde uit te voeren:

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;

(merk op dat ik ook de laatste filterexpressie heb herschreven zodat de tabelkolom aan één kant van de expressie is geïsoleerd - wat een klein snelheidsvoordeel heeft wanneer de kolom niet is geïndexeerd, maar een enorm voordeel wanneer deze is geïndexeerd).

Of gebruik seconden-sinds-tijdperk....

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

(die uiteraard geen indexoptimalisatie kan gebruiken).



  1. MySQL Stored Procedures werken niet met SELECT (basisvraag)

  2. Illegale mix van sorteringen (utf8_unicode_ci,IMPLICIT) en (utf8_general_ci,IMPLICIT) voor bewerking '='

  3. Oracle JDeveloper 12c gebruiken met Oracle Database, deel 2

  4. Een berekende kolom maken in SQLite