Magento2构架在时间处理上,确实是一个神奇的存在,而这次依然还是时间截的问题。

一、先说说表象,程序上需要按时间去做sql拼接查询数据库,获取指定时间内的订单数据

  • 数据库是用了日本东京时间;
  • 后台设置的也是日本东京时间;
  • 服务器设置的,也是日本东京时间;

二、直接查看后台的订单时间,对比数据库的时间,显示是一致的

  • 数据库sale_order的created_at字段显示是:2020-12-17 23:48:01
  • 后台订单列表的订单时间显示是:Dec 17, 2020,  23:48:01 PM (实际上也与数据库的是一样的时间,只是magento格式化后显示格式不一样而已)

三、当看到数据库字段的时候与后台显示的订单时间一样后,就不再使用时间截做时间格式转化,在程序里直接使用的sql拼接时间,sql大概如下:

SELECT `main_table`.`status`, `main_table`.`increment_id`, `main_table`.`created_at`, `order_item`.`name`, `order_item`.`sku` FROM `sales_order` AS `main_table` LEFT JOIN `sales_order_item` AS `order_item` ON `order_item`.order_id=`main_table`.entity_id WHERE (main_table.status in ('complete')) AND (main_table.created_at >= '2020-12-17 23:47:00') AND (main_table.created_at <= '2020-12-17 23:48:59') GROUP BY `order_item`.`sku` ORDER BY `main_table`.`created_at` DESC
以上sql语句是在代码里面输出结果
异常:程序执行后,并没有结果,把sql复制到数据库直接查询,却是正常有结果的。(也就是说相同的sql语句在程序上执行没有结果,而放到数据库执行却有结果,思考如下:

1、会不会是已经拿到数据,但因为magento的连接缓存原因,导致没能拿到结果。

2、会不会是magento在执行之前,连接数据库之后,还会再转换一次sql语句里面的时间,导致没能拿到结果。

尝试以下的定位方案
  • 对于第1种情况:清除了所有magento的缓存、php的缓存,依然无效。
  • 对于第2种情况:通过mysql的日志记录到的sql语句依然如上,这就说明了SQL语句在magento传到mysql之后,并没有再做转换,还是那一个sql语句
多次尝试后,最终解决,依然还是要使用时间截convertDate做时间转换,才能查询到准确的结果,而原因至今未知。