【问题标题】:Magento group by clause on date fieldMagento group by 日期字段上的子句
【发布时间】:2015-06-28 11:05:00
【问题描述】:

我需要在指定月份的一天内获取“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”在 DB 中存储为“2014-09-04 02:50:04”,但如果我们将其格式化为“Sep 3, 2014 4:50:04 PM”。 p>

那么,任何人都可以建议如何在 Collection 上应用按日期分组的子句。

提前致谢。

【问题讨论】:

  • 听起来像是时区问题。
  • @rick 是的,知道如何解决这个问题吗?
  • SHOW VARIABLES LIKE '%zone'; 并研究它向您显示的两个设置。找出操作系统的设置。 Magento 做了什么。

标签: php mysql magento group-by


【解决方案1】:

这是由于 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:由于夏令时,这仍可能导致您轮班工作 1 小时

$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")' );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多