我的数据库中存储了很多事件。每个事件都有一个开始时间,以UTC格式存储为DATETIME
。每个用户都可以选择自己的时区。
我想显示一个日历,该日历仅显示每月每天的活动数量。我无法GROUP BY DATE(start_dt)
,因为用户的日期不一定是在00:00:00 UTC开始。此外,用户的时区可能在月中有一个DST切换。
然后我唯一的选择是获取给定月份的每个事件,然后使用我的服务器端语言对它们进行分组和计数吗?
答案 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;