2015-04-21 10 views
5

Devo recuperare il numero totale di ordini, SUM, MIN MAX e AVG di "grand_total" in un giorno per un mese specificato. Questo è quello che sto facendo.Gruppo Magento per clausola sul campo data

$collection->getSelect() 
       ->columns('SUM(base_grand_total) AS total') 
       ->columns('COUNT(*) AS orders_count') 
       ->columns('DATE_FORMAT(created_at, "%d") AS order_day') 
       ->columns('DATE_FORMAT(created_at, "%d/%m/%y") AS order_date') 
       ->columns('AVG(base_grand_total) AS avg_total') 
       ->columns('MAX(base_grand_total) AS max_total') 
       ->columns('MIN(base_grand_total) AS min_total') 
       ->where('DATE_FORMAT(created_at, "%m") = ?', $month) 
       ->where('DATE_FORMAT(created_at, "%Y") = ?', $year) 
       ->group('DATE_FORMAT(created_at, "%d-%m-%y")'); 

$ mese è "set" e $ l'anno è "2014"

Current Output for the above query on Custom Grid System

what Sales > Order says for same time period

Sopra interrogazione dice che ci sono 3 ordini di 26, ma di Magento vendite> Order la griglia dice che esiste un solo ordine per il 26 °. Immagino che la risposta si trovi all'interno, "created_at" memorizzato come "2014-09-04 02:50:04" in DB, ma se formattiamo questo è il "Set 3, 2014 4:50:04 PM" .

Quindi, qualcuno può suggerire come applicare la clausola group by date alla raccolta.

Grazie in anticipo.

+0

suona come una problema del fuso orario. –

+0

@rick si, qualche idea su come risolvere questo? – ROBIN

+0

'MOSTRA VARIABILI COME '% zone';' e ricerca le due impostazioni che mostra. Scopri a cosa è impostato il sistema operativo. E cosa fa Magento. –

risposta

2

Ciò è causato dal fatto che Magento esegue le date di analisi dal database per impostarle nel fuso orario impostato su System > Configuration > General > Locale Options > Timezone. Ma in realtà salva i valori nel database in GMT.

Ma questa è un'informazione si può ottenere e convertire allo stesso modo:

Soluzione 1: che considerano l'ora legale turno, ma si ha bisogno di server MySQL essere configurato correttamente e fusi orari da caricare correttamente .

Per capire se i fusi orari vengono caricati sul server, eseguire la query

select * from mysql.time_zone_name; 

Se che si restituisce un elenco dei fusi orari, si dovrebbe essere pronti per partire (anche se altre tabelle possono avere a essere riempito correttamente, si prega di consultare anche questa risposta: https://stackoverflow.com/a/15419843/2123530)

Se non si dispone di tutti i record in questa tabella, si prega di fare riferimento al manuale di MySQL su come caricare quelle informazioni sul server: http://dev.mysql.com/doc/refman/5.7/en/mysql-tzinfo-to-sql.html

Poi, quando y ou sono tutti buoni, che dovrebbe essere la query corretta:

$GMTToLocaleTZDiff = Mage::getStoreConfig('general/locale/timezone',0); 

$collection->getSelect() 
       ->columns('SUM(base_grand_total) AS total') 
       ->columns('COUNT(*) AS orders_count') 
       ->columns('DATE_FORMAT(created_at, "%d") AS order_day') 
       ->columns('DATE_FORMAT(created_at, "%d/%m/%y") AS order_date') 
       ->columns('AVG(base_grand_total) AS avg_total') 
       ->columns('MAX(base_grand_total) AS max_total') 
       ->columns('MIN(base_grand_total) AS min_total') 
       ->columns("CONVERT_TZ(created_at,'GMT','".$GMTToLocaleTZDiff."') AS created_at") 
       ->where('DATE_FORMAT(created_at, "%m") = ?', $month) 
       ->where('DATE_FORMAT(created_at, "%Y") = ?', $year) 
       ->group('DATE_FORMAT(created_at, "%d-%m-%y")'); 

Soluzione 2: Che potrebbe ancora si realizzi un trasferimento un'ora a causa del legale

$GMTToLocaleTZDiff = Mage::getSingleton('core/locale')->storeDate()->get(Zend_Date::GMT_DIFF_SEP); 

$collection->getSelect() 
       ->columns('SUM(base_grand_total) AS total') 
       ->columns('COUNT(*) AS orders_count') 
       ->columns('DATE_FORMAT(created_at, "%d") AS order_day') 
       ->columns('DATE_FORMAT(created_at, "%d/%m/%y") AS order_date') 
       ->columns('AVG(base_grand_total) AS avg_total') 
       ->columns('MAX(base_grand_total) AS max_total') 
       ->columns('MIN(base_grand_total) AS min_total') 
       ->columns("CONVERT_TZ(created_at,'+00:00','".$GMTToLocaleTZDiff."') AS created_at") 
       ->where('DATE_FORMAT(created_at, "%m") = ?', $month) 
       ->where('DATE_FORMAT(created_at, "%Y") = ?', $year) 
       ->group('DATE_FORMAT(created_at, "%d-%m-%y")');