Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理PHP+;MySQL时区和MySQL按[日期]分组查询?_Php_Mysql_Drupal_Datetime_Timezone - Fatal编程技术网

如何处理PHP+;MySQL时区和MySQL按[日期]分组查询?

如何处理PHP+;MySQL时区和MySQL按[日期]分组查询?,php,mysql,drupal,datetime,timezone,Php,Mysql,Drupal,Datetime,Timezone,我正在使用Drupal7、PHP和MySQL,并试图在从MySQL数据库查询时了解时区问题 Drupal可以很好地处理日期:所有日期都以UTC timestamp int的形式存储在数据库中,并且使用PHP5的内置时区功能(因此每次运行PHP脚本时,脚本的时区都设置为当前用户的时区),通过每个用户配置文件中的时区设置,对每个用户进行时区转换 因此,只要我们坚持使用PHP,这一切都很好、很好、相当轻松 当我们引入MySQL时,事情开始变得棘手,因为似乎没有办法将当前PHP脚本时区与给定的MySQL

我正在使用Drupal7、PHP和MySQL,并试图在从MySQL数据库查询时了解时区问题

Drupal可以很好地处理日期:所有日期都以UTC timestamp int的形式存储在数据库中,并且使用PHP5的内置时区功能(因此每次运行PHP脚本时,脚本的时区都设置为当前用户的时区),通过每个用户配置文件中的时区设置,对每个用户进行时区转换

因此,只要我们坚持使用PHP,这一切都很好、很好、相当轻松

当我们引入MySQL时,事情开始变得棘手,因为似乎没有办法将当前PHP脚本时区与给定的MySQL查询完全同步。似乎最佳实践要求在PHP中处理所有时区转换:只查询数据库中的原始时间戳,然后根据需要在PHP中进行转换

在大多数情况下,这似乎是合理的(即使有时稍微慢一点),但是我应该如何处理MySQL GROUP BY[date]查询呢?例如,我正在构建一个模块来处理分析,并且经常想做以下事情:

GROUP BY YEAR(FROM_UNIXTIME(u.created)), MONTH(FROM_UNIXTIME(u.created))
所以我们遇到了时区问题

脑海中浮现的可能解决方案:

  • 硬编码时区:在我的模块中使用date\u default\u timezone\u set()确保PHP时区始终设置为系统时区(因此MySQL timezone=PHP timezone)。换句话说,分析时区将被硬编码,而不是尊重查看分析的用户的时区。这并不理想,因为我们希望多个时区的用户能够使用他们的时区访问分析。另外,date\u default\u timezone\u set()似乎把Drupal搞得一团糟,因为它为整个脚本设置了时区,而不仅仅是在一个特定的函数中

  • 忘记在查询中使用GROUPBY:只需从数据库中获取所有原始数据(可以有几十行或几十万行),然后使用for循环在php中按日期对结果进行分组。。。这个解决方案似乎会大大增加资源密集度、速度较慢,而且有些荒谬

  • 我想我要问的是,我错过了什么吗?这里有我不知道的最佳实践吗


    非常感谢你的帮助
    SET time_zone = '+02:00';
    

    而且

    GROUP BY FROM_UNIXTIME(u.created, '%Y-%m');
    
    由于
    FROM_UNIXTIME
    将其时间基于
    时区
    ,因此这将给出所需的结果


    撤消<代码> TimeJavaSux>代码>更改后,考虑先保存,然后将其设置为保存值。

    谢谢罗宾的想法。MySQL SET time_zone的问题在于其作用域适用于整个客户端连接,而不是特定的查询,据我所知,新时区将影响每个Drupal db查询。有没有办法绕过这个问题?然后保存默认的
    时区
    ,然后运行一个查询,将其重置为以前的值。如果我错了,请纠正我,但由于每分钟可能有数千次页面浏览,似乎无法保证在时区更改和重置之间不会执行其他查询。当然,无论如何我都感谢你的建议。。。我并没有想出更好的主意……据我所知,这只会影响当前的执行。一次执行一个查询。因此,我看这里没有问题<代码>每个连接时区。每个连接的客户端都有自己的时区设置,由会话时间\u区域变量给出。感谢Robin的帮助。尽管如此,我仍然对此感到谨慎。。。就Drupal而言,我不确定db“连接”何时开始和结束。。。你有这方面的知识吗?你能指出一些文件吗?