我需要在指定月份的一天内获取“grand_total”的订单总数,SUM,MIN MAX和AVG。这就是我在做的事。
$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")' );
$ month是“Sep”,$ year是“2014”
以上查询显示26日有3个订单,但magento的销售>订单网格表示第26个订单只有一个订单。我想答案就在于, “ created_at ”在数据库中存储为“2014-09-04 02:50:04”,但如果我们将其格式化为“2014年9月3日下午4:50:04”。
因此,任何人都可以建议如何在Collection上应用group by date子句。
先谢谢。
答案 0 :(得分:3)
这是因为Magento确实从数据库解析日期以在System > Configuration > General > Locale Options > Timezone
下设置的时区中设置日期。但实际上是以GMT格式保存数据库中的值。
但这是一个你可以获得并以同样方式转换的信息:
解决方案1 :考虑夏令时转变,但需要正确配置MySQL服务器并正确加载时区。
要确定服务器上是否已加载时区,请运行此查询
select * from mysql.time_zone_name;
如果它返回一个时区列表,你应该好好去(虽然其他表可能必须正确填写,请同时看到这个答案:https://stackoverflow.com/a/15419843/2123530)
如果此表中没有任何记录,请参阅MySQL手册,了解如何在服务器上加载这些信息:http://dev.mysql.com/doc/refman/5.7/en/mysql-tzinfo-to-sql.html
然后,当你们都很好的时候,这应该是正确的查询:
$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")' );
解决方案2 :由于夏令时,这仍然可能导致您转班一小时
$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")' );