5

目前我正在研究一个计算数据并按 ID 将其存储在分析数据库中的项目。

例如,一篇新闻文章被阅读的次数(因此大约有 20 类数据以整数形式存储)。

我们将数据存储在如下字段中: int user_id int value_type_id int value datetime datetime

我们使用 4 个表,x_hour、x_day、x_week、x_month 这样我们就不必计算潜在的几千甚至几百万条记录的数据。

数据需要动态计算并通过某些连接过滤。这一切都没有问题,并且按预期以令人满意的速度工作。

接下来的问题。我们希望数据显示在查看它的用户的时区中,时区并不总是相同的,因为它可能很有趣,例如 UTC-5 或 UTC+4。

由于我们将日期存储在 UTC 上,因此我们在天、周和月的间隔方面存在问题,因为如果活动在午夜前一小时存储,则较大的间隔将其视为昨天,即使它可能在该时区的同一天。

我已将解决方案阅读为添加 24 列来保存每个时区的数据,是否有人有不同的解决方案。

4

2 回答 2

3

继续以 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。

于 2013-04-02T10:15:19.287 回答
1

似乎唯一的方法是使用 15 分钟的存储桶或精确定义的时区,因为那样只会得到大约 40 列。

然后我们必须在几天几周和几个月内做同样的事情,这样我们就有每个时区的正确数据。

花费更多时间并占用更多数据存储空间,但如果我们保持数据清洁,这可能是一个足够体面的解决方案。

于 2013-04-03T07:57:29.247 回答