如何按日期分组,计算时区和夏令时?

时间:2015-01-18 21:34:10

标签: mysql datetime timezone

我的数据库中存储了很多事件。每个事件都有一个开始时间,以UTC格式存储为DATETIME。每个用户都可以选择自己的时区。

我想显示一个日历,该日历仅显示每月每天的活动数量。我无法GROUP BY DATE(start_dt),因为用户的日期不一定是在00:00:00 UTC开始。此外,用户的时区可能在月中有一个DST切换。

然后我唯一的选择是获取给定月份的每个事件,然后使用我的服务器端语言对它们进行分组和计数吗?

3 个答案:

答案 0 :(得分:12)

你可以尝试

SELECT ... FROM ... GROUP BY DATE(CONVERT_TZ(start_dt,'UTC','America/Vancouver'))

请注意,在此之前您需要load the timezone data into MySQL

答案 1 :(得分:1)

不幸的是,DATETIME列存储时没有时区信息:

  

当前时区设置不会影响由UTC_TIMESTAMP()等函数显示的值或DATE,TIME或DATETIME列中的值。这些数据类型中的值也不是以UTC格式存储的;只有从TIMESTAMP值转换时,时区才适用于它们。如果您想要DATE,TIME或DATETIME值的特定于语言环境的算法,请将它们转换为UTC,执行算术,然后转换回来。 [MySQL Docs]

幸运的是,这确实意味着日期/时间函数应该与时区支持一起使用,但仅适用于TIMESTAMP列。进入TIMESTAMP列后,日期/时间功能应该能够考虑@@session.time_zone,您可以根据需要更改以获得不同的时区。

因此,您的选择是将表保留为DATETIME列,并自行完成所有分组,或将这些列转换为TIMESTAMP并让MySQL执行此操作 - 但如果列已经在不同的和不一致的时区,你将为你完成工作......

答案 2 :(得分:0)

您可以中间切换到用户tz:

  SET @@session.time_zone = "+05:00"; 
  select ... from .. group by MONTH(datefield);
  SET @@session.time_zone = @@global.time_zone;

刚刚找到:How do I set the time zone of MySQL?