从已保存的UTC计算不同时区的Facebook赞,评论和分享

时间:2014-01-29 09:00:23

标签: sql-server utc timezone-offset

我一直在努力解决这个问题,并希望有人能给我一个解决这个问题的想法。

我们有一项服务,每天多次为每次状态更新收集Facebook的评论,评论和分享。存储此数据的表格如下:

PostId        EngagementTypeId     Value   CollectedDate    
100             1(for likes)        10       1/1/2013 1:00 
100             2 (comments)        2        1/1/2013 1:00
100             3                   0.       1/1/2013 1:00
100.            1.                  12       1/1/2013 3:00
100.            2.                  3.       1/1/2013 3:00
100.            3                   5.       1/1/2013 3:00

值包含收集时每种参与类型的总数。

我要求创建一个报告,显示每天在不同时区的新价值。

目前,我正在一个存储过程中进行计算,该存储过程采用时区偏移量并基于此计算每天的增量值。如果这是针对加利福尼亚州的某个人,则报告将显示12个赞,3个评论和5个12/31/2012的股票。但如果时区偏移为-1的人,他将在2012年12月31日看到10个喜欢,并在2013年1月1日看到2个喜欢。

如果我们有大量数据和大日期范围,我遇到的问题是即时进行计算可能会很慢。我们正在讨论为每天预先计算的delta并存储在一个表中,我可以从中查询(我们正在考虑SSAS,但这是针对下一阶段)。但是这样做,我需要为24个时区提供每天的数据。我是否正确(如果是这样,这不是理想的)或者有更好的方法来解决这个问题吗?

我正在使用SQL 2012。

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要根据用户的UTC时间将存储在列中的UTC DateTime转换为Date。这样您就不必担心任何必须填充数据的表。要从UTC列获取用户日期,您将使用类似

的内容
SELECT CONVERT(DATE,(DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), '01/29/2014 04:00'))) 
   AS MyLocalDate

上面的select语句根据UTC日期和本地日期的差异计算出本地日期。您需要将[{1}}替换为传入您的程序的用户GETDATE(),并将DATETIME替换为您的列。这样,当您从表中选择任何日期时,将根据用户当地时间的日期。比你可以相应地计算其他字段。