如何处理MySQL中的时区?

时间:2014-07-25 07:33:42

标签: php mysql timezone

我有一个脚本,必须做一个" Google Analytics"喜欢任务。 基本上显示用户的访客统计信息。

我想在请求它的用户的时区生成报告。

到目前为止,我已经编写了一个代码:

SET time_zone = timezone;

它的作用是为每个MySQL连接设置时区。如果用户使用timestamp检索数据,则时间戳将转换为连接的时区。我将UTC存储在时间戳中。

所以一切似乎都有效。但有些人说这是一种错误的做法。因为多个用户无法使用不同的time_zone设置连接到数据库。

但是MySQL doc说:

  

每个连接时区。连接的每个客户端都有自己的时间   区域设置,由会话time_zone变量给出。最初,   session变量从全局time_zone变量中获取其值,   但客户可以使用此声明更改自己的时区

然而,他们坚持认为你根本不应该对MySQL的时区做任何事情。您应该在您的(例如)PHP代码中完成所有操作。 Here这个答案也有类似的问题。

但是我怎么能在PHP代码中做到这一点?我的意思是我知道如何在PHP中使用时区转换时间,但它不像我正在检索单行。

我正在检索数千行,并按timestamp字段中的日期对它们进行分组:

SELECT ... 
FROM logs 
WHERE 
user_id = :user_id
AND timestamp >= CURDATE() 
GROUP BY DATE(timestamp)

MySQL使用时间戳索引非常重要,因为我有数百万。即使我在时间戳GROUP BY DATE(timestamp)上使用函数,索引也能正常工作吗?如果不是我怎么能做到这一点?

那我该怎么做呢?我真的很感谢你的建议。

1 个答案:

答案 0 :(得分:0)

现在,用户将所有时间戳转换为他的tz,并使用时间戳(* user)> = CURDATE(* user)。 我认为另一种方式是

convert timestamp(user) to timestamp(server)

并使用

timestamp(*server) >= CURDATE(*server)

示例

dates =(5,6,7) 

(转换为我的tz)dates-2 = (3,4,5) (检查直接用这个数组约束)greaterThan3 result =(4,5) 第二种方式  (将约束转换为ts服务器)biggerThan3 -> biggerThan(3+2)5   (检查服务器阵列的约束)dates =(5,6,7) result=(6,7) 结果可以转换为(4,5)