我有一个脚本,必须做一个" 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)
上使用函数,索引也能正常工作吗?如果不是我怎么能做到这一点?
那我该怎么做呢?我真的很感谢你的建议。
答案 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)