目前我正在从事一个计算数据并将其按 ID 存储在分析数据库中的项目。
例如,一篇新闻文章的阅读次数(因此有大约 20 个类别的数据存储为整数)。
我们将数据存储在如下字段中: int user_id int value_type_id 整数值 日期时间日期时间
我们使用 4 个表,x_hour, x_day, x_week, x_month 这样我们就不必计算可能有几千甚至几百万条记录的数据。
数据需要即时计算并通过某些连接进行过滤。 这一切都没有问题,并且以令人满意的速度按预期工作。
接下来的问题。我们希望数据显示在查看它的用户的时区中,时区并不总是相同的,因为它可能是反时区,例如 UTC-5 或 UTC+4。
由于我们将日期存储在 UTC 上,因此我们在日、周和月的间隔方面遇到了问题,因为如果事件在午夜前一小时存储,则较大的间隔会将其视为昨天,即使它可能在同一天那个时区。
我读到的解决方案是添加 24 列来保存每个时区的数据,有没有人有不同的解决方案。
最佳答案
继续以 UTC 格式存储日期时间。
将用户的时区传递给查询。
在 SELECT
中转换,使用 CONVERT_TZ
功能:
CONVERT_TZ(`datetimefield`, 'UTC', 'Europe/Amsterdam')
其中“欧洲/阿姆斯特丹”被替换为适当的时区。
您最好使用上面的 IANA 时区字符串,而不是像“UTC-5”这样的偏移量,只要您有可用的数据。它将正确处理发生这种情况的地区围绕夏令时的问题。
进一步说明:https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html - 该程序用于使用时区数据初始化 MySQL。
关于mysql - 存储较长时间和时区的统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15761450/