Mar*_*cak 3 php mysql timezone convert-tz
我使用MySQL DATETIME列来存储日期和时间.日期为UTC.我想从一天中选择项目.我现在在做什么:
SELECT * FROM data WHERE DATE(CONVERT_TZ(datetime, 'UTC', 'Australia/Sydney')) = '2012-06-01'
Run Code Online (Sandbox Code Playgroud)
请注意,时区取决于用户
问题是桌面增长很慢.有没有解决方法如何让它更快?
目前,您的查询必须计算数据库的每一行的转换.你可能可以通过转换相反的方式使事情变得更好,这样转换只发生一次(或实际上两次,因为你必须形成一个范围).然后一个适当的索引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')
Run Code Online (Sandbox Code Playgroud)
或者,如果您担心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')
Run Code Online (Sandbox Code Playgroud)
在后一种形式中,您不必添加PHP端的小时数,而是可以简单地将日期作为字符串参数传递.
根据您的真正目标,使用TIMESTAMP
而不是DATETIME
可能是一个很好的解决方案。
TIMESTAMP
将日期时间存储为 UTC,在存储和提取时进行转换,从/到本地时区。这样,我从您的表中读取的内容与您存储的内容自动不同(假设我们处于不同的时区)。
是的,使用@MvG 翻转查询的方法。是的,使用他的第二种形式。
并索引该列。在复合索引中,将时间戳放在最后,即使它更具选择性。