Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wangarad 02. 11. 2020, 19:14:50

Název: PHP SQL spočítání řádků za posledí hodinu
Přispěvatel: Wangarad 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
Název: Re:PHP SQL spočítání řádků za posledí hodinu
Přispěvatel: slavJaro 02. 11. 2020, 20:46:22
date_format(now(),'%Y%m%d%H0000')
Název: Re:PHP SQL spočítání řádků za posledí hodinu
Přispěvatel: Ondrej Nemecek 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ě.
Název: Re:PHP SQL spočítání řádků za posledí hodinu
Přispěvatel: Filip Jirsák 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()).