MySQL查询按小时分组结果,同时考虑夏令时

时间:2013-04-04 15:08:20

标签: mysql group-by dst

我有一个使用与此类似的SQL查询的报告:

SELECT HOUR(somedatetime) AS hour, COUNT(*) AS count
FROM table
GROUP BY HOUR(surveyenddatetime)

我在这里简化了它,省略了可以将结果限制在给定时间段的where子句。它非常适合将所有记录按照所选时间段输入的小时数进行分组。

然而,它有一个致命的缺陷。如果选择的时间段包括与运行报告的用户不在同一“时区”内的记录,例如夏令时之前的记录和夏令时之后的记录,则它不起作用。所有记录都在日期时间字段中以GMT / UTC格式存储,并通过Web前端在php中转换为本地时间。但是这个查询在任何这种情况发生之前运行,并且php无法知道每个小时内总计的原始日期。

有没有办法可以解决这个问题,只使用MySQL查询来考虑夏令时,或者我将不得不做一些更复杂的事情?

1 个答案:

答案 0 :(得分:2)

CONVERT_TZ

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。)