Mysql时区并从一天中选择行

时间:2012-08-01 08:09:02

标签: php mysql timezone convert-tz

我使用MySQL DATETIME列存储日期&时间。日期为UTC。我想从一天中选择项目。我现在在做什么:

SELECT * FROM data WHERE DATE(CONVERT_TZ(datetime, 'UTC', 'Australia/Sydney')) = '2012-06-01'

请注意,时区取决于用户

问题在于表格增长很慢。 有没有解决方法如何让它更快?

3 个答案:

答案 0 :(得分:8)

目前,您的查询必须计算数据库每一行的转换。你可能可以通过转换相反的方式使事情变得更好,这样转换只发生一次(或实际上两次,因为你必须形成一个范围)。那么datetime上的正确索引应该会让事情变得非常快。

SELECT * FROM data
WHERE datetime BETWEEN CONVERT_TZ('2012-06-01 00:00:00', 'Australia/Sydney', 'UTC')
                   AND CONVERT_TZ('2012-06-01 23:59:59', 'Australia/Sydney', 'UTC')

或者,如果您担心23:60:00闰秒无法与任何查询匹配,您可以

SELECT * FROM data
WHERE datetime >= CONVERT_TZ('2012-06-01', 'Australia/Sydney', 'UTC')
  AND datetime < CONVERT_TZ('2012-06-01' + INTERVAL 1 DAY, 'Australia/Sydney', 'UTC')

在后一种形式中,您不必添加PHP端的小时数,而只需将日期作为字符串参数传递。

答案 1 :(得分:4)

根据您的真实目标,使用TIMESTAMP代替DATETIME可能是一个好的解决方案。

TIMESTAMP将日期时间存储为UTC,在存储时以及从本地时区获取时进行转换。这样,我从您的表中读取的内容将自动不同于您存储的内容(假设我们处于不同的时区)。

是的,使用@MvG翻转查询的方法。是的,请使用他的第二种形式。

并索引该列。在复合索引中,将时间戳放在最后,即使更具选择性。

答案 2 :(得分:1)

  1. 不要做SELECT *
  2. 索引 - 确保合适的colunms / id 字段已编入索引。
  3. 做时间转换php-side。
  4. 或确保你做1&amp; 2,它可以被包装到Stored Proc中,将时区作为参数传递。