繁体   English   中英

Mysql时区并从一天中选择行

[英]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翻转查询的方法。 是的,使用他的第二个表格。

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

  1. 不要做SELECT *
  2. 索引 - 确保索引适当的colunms / id字段。
  3. 做时间转换php端。
  4. 或者确保你做1和2并且可以将它包装到存储过程中,将时区作为参数传递。

目前 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM