Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Wangarad 02. 11. 2020, 19:14:50
-
Zdravim mam dalsiu otazku.
Chcem spocitat vsetky riadky ktore boly pridane za poslednu hodinu.
Pouzijem cosi taketo
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
-
date_format(now(),'%Y%m%d%H0000')
-
Minuty a sekundy můžete odříznout pomocí DATE_FORMAT. Takže:
-- 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:
-- 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ě.
-
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:
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()).