[英]Mysql timezone and selecting rows from one day
我使用 MySQL DATETIME 列来存储日期和时间。 日期采用 UTC。 我想从一天中选择项目。 我现在在做什么:
SELECT * FROM data WHERE DATE(CONVERT_TZ(datetime, 'UTC', 'Australia/Sydney')) = '2012-06-01'
请注意,时区取决于用户
问题是表格增长速度很慢。 有没有办法让它更快?
目前,您的查询必须计算数据库的每一行的转换。 你可能可以通过转换相反的方式使事情变得更好,这样转换只发生一次(或实际上两次,因为你必须形成一个范围)。 那么适当的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端的小时数,而是可以简单地将日期作为字符串参数传递。
根据您的真实目标,使用TIMESTAMP
而不是DATETIME
可能是一个很好的解决方案。
TIMESTAMP
将日期时间存储为UTC,在存储和提取时转换为/从本地时区转换。 这样,我从你的表中读取的内容会自动与你存储的内容不同(假设我们处于不同的时区)。
是的,使用@ MvG翻转查询的方法。 是的,使用他的第二个表格。
并索引列。 在复合索引中,将时间戳放在最后,即使它更具选择性。
目前 MySQL 查询如下:
SELECT * FROM data
WHERE datetime >= CONVERT_TZ('2012-06-01', '+00:00', '+10:00')
AND datetime < CONVERT_TZ('2012-06-01' + INTERVAL 1 DAY, '+10:00', '+00:00')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.