【问题标题】:Fetching yesterday's mySQL data with visitor's Time Zone使用访问者的时区获取昨天的 mySQL 数据
【发布时间】:2013-04-05 07:45:25
【问题描述】:

我正在使用成功获取昨天的 mySQL 数据

SELECT COUNT(*) as total FROM  track
WHERE  FROM_UNIXTIME(date,'%Y-%m-%d %h:%m:%s') > DATE_ADD(NOW(), INTERVAL -2 DAY) 
AND FROM_UNIXTIME(date,'%Y-%m-%d %h:%m:%s') < DATE_ADD(NOW(), INTERVAL -1 DAY)

但是,它使用服务器的时区。我的服务器位于美国,如果访问者来自与美国不同的时区(例如:亚洲或欧洲),我昨天的数据对于用户来说将不正确。我想根据访问者的时区获取正确的昨天结果。我可以在 php 中获取访问者时区,但我不知道如何在 mySQL 中使用它。

【问题讨论】:

标签: php mysql


【解决方案1】:

不要将时间存储为 UNIX 时间戳,而是存储为 TIMESTAMP。然后你可以简单地设置time_zone,一切都会按照你的意愿进行转换:

SET time_zone = '+10:00';

SELECT COUNT(*) AS total
FROM   track
WHERE  date > NOW() - INTERVAL 2 DAY
   AND date < NOW() - INTERVAL 1 DAY

否则,你可以使用CONVERT_TZ()

SELECT COUNT(*) AS total
FROM   track
WHERE  date > UNIX_TIMESTAMP(CONVERT_TZ(NOW() - INTERVAL 2 DAY, '+3:00', '+10:00'))
   AND date < UNIX_TIMESTAMP(CONVERT_TZ(NOW() - INTERVAL 1 DAY, '+3:00', '+10:00'))

【讨论】:

  • 我只是在输入一个回复来涵盖相同的问题。如果您对 MySQL 中的数据进行查询有任何设计,请不要使用 UNIX TIMESTAMPS。事实上,您需要在查询中使用这些时间戳之前将它们转换为 MySQL 日期时间,这意味着您将立即禁止使用索引进行查询优化。此答案中显示的第一个查询将能够使用date 上的索引,第二个不会)。我还要说明您可能只是想使用UTC作为@中所有日期的基础987654330@ 字段并让您的应用程序转换为本地用户时间。
  • @MikeBrant:查看我修改后的答案,其中索引可用于第二个查询(使用 UNIX 时间戳)。
  • @eggyal 好更新。事件虽然在这种情况下您可以解决索引问题,但我仍然会像您最初所做的那样向 OP 推荐使用 datetime/timestamp 字段,因为在其他时间您可能希望对字段上的其他聚合进行每日报告使用 unix 时间戳会很困难
  • 为什么你同时使用 +3:00 和 +10:00 ?
  • @user198989:从服务器时区转换,例如+3:00,到用户的时区,例如+10:00.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多