Magento group by 日期字段的子句
Magento group by clause on date field
我需要获取指定月份一天内 '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")' );
$月是 "Sep",$年是“2014”
上面的查询说 26 号有 3 个订单,但是 magento 的销售 > 订单网格说 26 号只有一个订单。我想答案就在里面,
“created_at”在数据库中存储为“2014-09-04 02:50:04”,但如果我们对其进行格式化,它就会变成 "Sep 3, 2014 4:50:04 PM".
所以,谁能建议如何对集合应用按日期分组的子句。
提前致谢。
这是因为 Magento 从数据库中解析日期以将它们设置在 System > Configuration > General > Locale Options > Timezone
下设置的时区中。但实际上在 GMT 中将值保存在数据库中。
但这是您可以获取并以相同方式转换的信息:
解决方案 1: 考虑夏令时,但需要您 MySQL 正确配置服务器并正确加载时区。
要确定您的服务器上是否加载了时区,运行 这个查询
select * from mysql.time_zone_name;
如果 returns 你是一个时区列表,你应该可以开始了(尽管其他 table 可能必须正确填写,另请参阅此答案:)
如果您在此 table 中没有任何记录,请参阅 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")' );
我需要获取指定月份一天内 '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")' );
$月是 "Sep",$年是“2014”
上面的查询说 26 号有 3 个订单,但是 magento 的销售 > 订单网格说 26 号只有一个订单。我想答案就在里面, “created_at”在数据库中存储为“2014-09-04 02:50:04”,但如果我们对其进行格式化,它就会变成 "Sep 3, 2014 4:50:04 PM".
所以,谁能建议如何对集合应用按日期分组的子句。
提前致谢。
这是因为 Magento 从数据库中解析日期以将它们设置在 System > Configuration > General > Locale Options > Timezone
下设置的时区中。但实际上在 GMT 中将值保存在数据库中。
但这是您可以获取并以相同方式转换的信息:
解决方案 1: 考虑夏令时,但需要您 MySQL 正确配置服务器并正确加载时区。
要确定您的服务器上是否加载了时区,运行 这个查询
select * from mysql.time_zone_name;
如果 returns 你是一个时区列表,你应该可以开始了(尽管其他 table 可能必须正确填写,另请参阅此答案:)
如果您在此 table 中没有任何记录,请参阅 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")' );