Nette\Database a GROUP BY fn

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

Nazdar, vybírám z tabulky termínů záznamy po dnech a prosím o radu.

pro SQL:

SELECT * FROM terminy WHERE datum > NOW() GROUP BY DATE_FORMAT(datum, '%d.%m.%Y') ORDER BY datum

jsem zplodil toto:

$this->getTable('terminy')
            ->where('datum > ?', date("Y-m-d H:i:s"))
            ->group("DATE_FORMAT(datum, '%d.%m.%Y')")
            ->order('datum');

a to přirozeně nefunguje. Nevíte jak se přes NotORM řeší takovéto více „custom“ dotazy?

Editoval vitush93 (23. 8. 2013 17:35)

mkoubik
Člen | 728
+
0
-

Píšu to z hlavy, ale mohlo by fungovat

$this->getTable('terminy')
	->where('datum > ?', new \DateTime())
	->group(new \Nette\Database\SqlLiteral('DATE_FORMAT(datum, \'%d.%m.%Y\')'))
	->order('datum');
vitush93
Člen | 33
+
0
-

mkoubik napsal(a):

Píšu to z hlavy, ale mohlo by fungovat

$this->getTable('terminy')
	->where('datum > ?', new \DateTime())
	->group(new \Nette\Database\SqlLiteral('DATE_FORMAT(datum, \'%d.%m.%Y\')'))
	->order('datum');

Diky za odpoved. taky si ted hraju se SqlLiteral. Nejde – mám to samé. Vygenerované query dopadne takto:

SELECT *
FROM `terminy`
WHERE (`datum` > '2013-08-23 17:53:44')
GROUP BY DATE_FORMAT(`datum`, '%`d`.%`m`.%Y')
ORDER BY `datum`

formát data se blbě escapne :(

vitush93
Člen | 33
+
0
-

tak tenhle konkrétní problém jsem vyřešil nahrazením mysql funkce:

$this->getTable('terminy')
                ->where('datum > ?', new DateTime())
                ->group(new SqlLiteral("DATE(datum)"))
                ->order('datum');

stejně by mne ale zajimalo jak by se postupovalo v predchozim pripade..

petr.pavel
Člen | 535
+
0
-
$this->getTable('terminy')
  ->select("*, DATE_FORMAT(datum, '%d.%m.%Y') AS fDatum")
  ->where('datum > CURRENT_TIMESTAMP')
  ->group("fDatum")
  ->order('datum');

Mimochodem, jaký to má smysl GROUPovat podle formátovaného času? Jestli máš ‚datum‘ ve skutečnosti TIMESTAMP, tak bys měl spíš CASTovat, než formátovat. Tím taky zachováš NULLové hodnoty.

->group('CAST(datum AS DATE)')