sql >> Databáze >  >> RDS >> Mysql

Matoucí aritmetické chování php/Mysql Time

Je to proto, že provádíte implicitní přetypování z mysql datetime na celé číslo.

Např. mysql si myslí, že čas (když to píšu) je 2011-12-15 13:42:10, ale kdybych požádal mysql, aby od toho odečetl 90, bylo by to cvičení 20111215134210 - 90 =20111215134120, což je 1:203:před sekundami.

Buď zacházejte s časem jako s celým číslem (převedením do/z unixového časového razítka, jak navrhuje liquorvicar), nebo použijte funkce data k počítání s hodnotou 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;

(Všimněte si, že jsem také přepsal poslední výraz filtru tak, že sloupec tabulky je izolován na jedné straně výrazu - což má malou výhodu rychlosti, když sloupec není indexován, ale obrovskou výhodu, když je indexován).

Nebo pomocí sekund-od-epochy....

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

(který samozřejmě nebude moci používat optimalizaci indexu).



  1. Co dělá DELIMITER // ve spouštěči?

  2. Jak zjistit, z jaké tabulky pochází výsledek při použití UNION v MySQL

  3. Vícenásobné výběrové příkazy v jediném dotazu

  4. Zřetězení řetězců SQL Server s hodnotou Null