PHP SQL spočítání řádků za posledí hodinu

PHP SQL spočítání řádků za posledí hodinu
« kdy: 02. 11. 2020, 19:14:50 »
Zdravim mam dalsiu otazku.
Chcem spocitat vsetky riadky ktore boly pridane za poslednu hodinu.
Pouzijem cosi taketo
Kód: [Vybrat]
select count(*) as cnt
from  log
where date >= DATE_SUB(NOW(),INTERVAL 1 HOUR);
ale ako to spravit tak aby to spocitalo vsetky riadky pridane v tejto hodine?
Je 19:11 a chcem vediet co bolo pridane od 19:00. Co je lepsie nieako modifikovat query alebo si vzdy na zaciatku nacitat cas resp vypocitat celu aktualnu hodinu? Snazim sa to robit co najefektivnejsie vzhladom na obmedzene zdroje sql serveru
« Poslední změna: 02. 11. 2020, 19:31:04 od Petr Krčmář »


Re:PHP SQL spočítání řádků za posledí hodinu
« Odpověď #1 kdy: 02. 11. 2020, 20:46:22 »
date_format(now(),'%Y%m%d%H0000')

Re:PHP SQL spočítání řádků za posledí hodinu
« Odpověď #2 kdy: 02. 11. 2020, 21:51:56 »
Minuty a sekundy můžete odříznout pomocí DATE_FORMAT. Takže:
Kód: [Vybrat]
-- date >= start AND date < end:

SELECT count(*) AS cnt
FROM log WHERE
date >= CONVERT(DATE_FORMAT(NOW(),'%Y-%m-%d %H:00:00'), DATETIME)
date <  CONVERT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 1 HOUR),'%Y-%m-%d %H:00:00'), DATETIME);

Nebo úspornější zápis:
Kód: [Vybrat]
-- date BETWEEN start AND end:

SELECT count(*) AS cnt
FROM log WHERE
date
BETWEEN CONVERT(DATE_FORMAT(NOW(),'%Y-%m-%d %H:00:00'), DATETIME)
AND CONVERT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 1 HOUR),'%Y-%m-%d %H:00:00'), DATETIME);

V Mysql je pro CONVERT výchozí DATETIME formát 'YYYY-MM-DD HH:MM:SS', takže pokud použijete tento formát, nemusíte používat STR_TO_DATE() ale stačí CONVERT. On ani ten CONVERT není asi potřeba, jelikož se zavolá implicitně.

Re:PHP SQL spočítání řádků za posledí hodinu
« Odpověď #3 kdy: 02. 11. 2020, 22:26:38 »
V normální databázi byste použil oříznutí na hodiny. Vy zřejmě používáte MySQL. Než převádět datum a čas na text a zase zpět, radši bych použil funkci TIMESTAMPADD:

Kód: [Vybrat]
select count(*) as cnt
from  log
where date >= TIMESTAMPADD(HOUR, HOUR(TIME(NOW())), DATE(NOW()));

Případně můžete zkusit vypátrat, jestli CURDATE() vrací údaje ke stejnému okamžiku, jako NOW() – pak byste to mohl použít jako třetí parametr místo DATE(NOW()).