我有一个使用与此类似的SQL查询的报告:
SELECT HOUR(somedatetime) AS hour, COUNT(*) AS count
FROM table
GROUP BY HOUR(surveyenddatetime)
我在这里简化了它,省略了可以将结果限制在给定时间段的where子句。它非常适合将所有记录按照所选时间段输入的小时数进行分组。
然而,它有一个致命的缺陷。如果选择的时间段包括与运行报告的用户不在同一“时区”内的记录,例如夏令时之前的记录和夏令时之后的记录,则它不起作用。所有记录都在日期时间字段中以GMT / UTC格式存储,并通过Web前端在php中转换为本地时间。但是这个查询在任何这种情况发生之前运行,并且php无法知道每个小时内总计的原始日期。
有没有办法可以解决这个问题,只使用MySQL查询来考虑夏令时,或者我将不得不做一些更复杂的事情?
答案 0 :(得分:2)
SELECT
HOUR(CONVERT_TZ(`somedatetime`, 'UTC', 'Europe/Amsterdam')) AS `hour`,
COUNT(*) AS `count`
FROM table
GROUP BY `hour`
将用户的时区传递给查询以代替'Europe / Amsterdam'。
另请参阅:https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html(您可能需要使用时区数据初始化MySQL。)