目前我正在研究一个计算数据并按ID在分析数据库中存储的项目。
例如,一篇新闻文章被阅读的次数(因此,大约有20类数据存储为整数)。
我们按照如下方式将数据存储在字段中:int user_idint value_type_idint值日期时间
我们使用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')
其中'Europe/Amsterdam'被替换为相应的时区。
你最好像上面那样使用IANA时区字符串,而不是像'UTC-5'这样的偏移量,只要你有这个数据可用。它将正确地处理发生这种情况的地区的夏令时问题。
进一步说明:https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html
似乎唯一的方法是使用15分钟的桶,或者精确定义的时区,因为只有大约40列。
然后我们必须对天、周和月做同样的事情,这样我们就有了每个时区的正确数据。
有点耗时和占用更多的数据存储,但如果我们保持我们的数据干净,这可能是一个足够体面的解决方案