我使用MySQL DATETIME列存储日期&时间。日期为UTC。我想从一天中选择项目。我现在在做什么:
SELECT * FROM data WHERE DATE(CONVERT_TZ(datetime, 'UTC', 'Australia/Sydney')) = '2012-06-01'
请注意,时区取决于用户
问题在于表格增长很慢。 有没有解决方法如何让它更快?
答案 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)