2

我有一个使用类似于此的 sql 查询的报告:

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

我在这里简化了它,省略了可以将结果限制在给定时间段内的 where 子句。它可以很好地获取在所选时间段内输入的按一天中的小时分组的总记录。

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

有没有一种方法可以解决这个查询,仅使用 MySQL 查询将夏令时考虑在内,还是我必须做一些更复杂的事情?

4

1 回答 1

2

CONVERT_TZ

SELECT 
    HOUR(CONVERT_TZ(`somedatetime`, 'UTC', 'Europe/Amsterdam')) AS `hour`, 
    COUNT(*) AS `count`
FROM table
GROUP BY `hour`

将用户的时区代替“欧洲/阿姆斯特丹”传递到查询中。

另请参阅:https : //dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html(您可能需要使用时区数据初始化 MySQL。)

于 2013-04-04T15:16:08.567 回答