DATE_FORMAT v Nette\Database\Table select()
- chaky
- Člen | 22
Dobrý den,
potřebuji v mysql databázi udělat následující databázový výber:
SELECT DATE_FORMAT(msgtime, ‚%Y.%m‘) AS archive_date, COUNT(*) AS num_messages FROM message GROUP BY archive_date ORDER BY archive_date;
Pokud však tohle předám metodě select(), tak uvnitř třídy SqlBuilder
v metodě tryDelimite dojde ke zmrvení toho formátovacího řetězce na tohle
‚%Y.%m
‘.
S Nette si dnes hraju teprve první den a tak bych se chtěl zeptat jakým způsobem se tento problém běžně řeší.
(V daném případě si mohu pomoci přes SUBSTRING, ale moc se mi takové řešení nelíbí.)
Předem děkuji za odpověď.
S pozdravem – Michal Hučík
Editoval chaky (26. 6. 2013 19:45)
- chaky
- Člen | 22
saimons napsal(a):
A proc formatovani neudelas az na objektu, ktery se vrati z DB. Atribut „archive_date“ bude type DateTime.
Protože to má důležitý význam pokud je to položeno současně s tím COUNT a GROUP BY ;)
V té tabulce mám několik tisíc řádku s archivem zpráv. Každá zpráva má atribut/sloupec, kterým je datum a čas jejího vytvoření. Takto položeným SQL dotazem získám seznam ve kterém bude v jednom sloupci jedinečný rok/měsíc a ve druhém počet zpráv náležících tomuto měsíci. Kdybych to měl formátovat, grupovat a počítat až v PHP, tak by to mělo zbytečně velkou režii.
- jiri.pudil
- Nette Blogger | 1032
Jde to i bez CONCATu:
SELECT MONTH(msgtime) AS month, YEAR(msgtime) AS year, COUNT(id) AS num_messages FROM message GROUP BY year, month ORDER BY year, month
- David Matějka
- Moderator | 6445
v 2.0.* to bude problem, ale v nette 2.1 (dev) by mel asi fungovat (nezkousel jsem) zapis pomoci parametru (ty uz jdou narvat nejen do where ale prave i do select, order…)
$selection->select('DATE_FORMAT(msgtime, ?) AS archive_date', '%Y.%m');
- chaky
- Člen | 22
matej21 napsal(a):
v 2.0.* to bude problem, ale v nette 2.1 (dev) by mel asi fungovat (nezkousel jsem) zapis pomoci parametru (ty uz jdou narvat nejen do where ale prave i do select, order…)
$selection->select('DATE_FORMAT(msgtime, ?) AS archive_date', '%Y.%m');
Ano, to je způsob práce jaký jsem si nakonec zvolil – akorát to tam nedávám jako parametr, ale píšu to rovnou uvnitř toho selectu. Mám tam spoustu dalších SQL dotazů, které jsou protkané různými LEFT JOIN konstrukcemi, takže jsem začal používat výhradně $selection->select() metodu.