DATE_FORMAT v Nette\Database\Table select()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chaky
Člen | 22
+
+1
-

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
+
0
-

Odpovím si sám :) Zřejmě bude nejlepší vykašlat se na Table Selection API a používat rovnou metody exec() a query().

saimons
Člen | 293
+
0
-

A proc formatovani neudelas az na objektu, ktery se vrati z DB. Atribut „archive_date“ bude type DateTime.

chaky
Člen | 22
+
0
-

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.

enumag
Člen | 2118
+
0
-

@chaky: Kombinace SQL funkcí CONCAT, MONTH a YEAR by měla fungovat.

saimons
Člen | 293
+
0
-

@chaky: Jo mas pravdu, jsem se prehlidnul. Toto jsem resil take jak pise @enumag.

jiri.pudil
Nette Blogger | 1032
+
0
-

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
+
+1
-

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
+
0
-

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.