【问题标题】:PHP, MySQL: SELECT by individual timezone preferencesPHP、MySQL:按个人时区偏好选择
【发布时间】:2014-06-09 06:04:42
【问题描述】:

我有一个表(比如说)存储点击:

id |      datetime         |  ...
-----------------------------------
1  |  2014-05-30 15:19:00  |  ...
2  |  2014-06-01 12:14:00  |  ...
3  |  2014-06-04 13:06:00  |  ...
4  |  2014-06-04 17:26:00  |  ...
5  |          ...          |  ...

用户可以生成报告,他们可以选择日期范围。但是我想让用户能够使用他们自己的时区偏好。

目前我使用这样的查询来选择今天的列:

... WHERE datetime >= CURDATE()

我该怎么做?将日期存储为 unixtime 更好吗? 我已经阅读了 Google 上的所有结果,但我很困惑。

这个查询会被调用很多,所以性能很重要

【问题讨论】:

    标签: php mysql datetime timezone unix-timestamp


    【解决方案1】:

    您可以从用户那里获取时区偏好作为国家/地区的名称,并使用它来相应地设置时区:

    SET time_zone = 'Europe/Helsinki';
    

    要为日期范围创建过滤器,您可以使用正常的 where 条件,如下所示:

    select * from table where hit_date>=startdate and hit_date<enddate
    

    性能:

    您可以使用 datetime 列创建索引,这将大大提高性能。要记住的一点是,使用经常更新的东西作为索引通常不是一个好主意。

    注意:

    假设您将页面点击日期时间存储在您自己的时区中,例如亚洲/北京,并且用户将其更改为“欧洲/赫尔辛基”,在这种情况下,您应该在执行查询之前相应地转换时区为使用

    检索正确的结果
    SELECT CONVERT_TZ('2004-01-01 12:00:00','Asia/Beijing','Europe/Helsinki');
    

    通俗地说,您应该在执行用户查询之前找到您所在时区的时间,因为数据库是根据您的时区填充的。

    用户时区---------->您的时区-------------->查询

    【讨论】:

    • 谢谢。但我试图避免像CONVERT_TZ(...) 这样的事情,因为我认为这对性能不利。索引不起作用,因为 MySQL 必须在知道其值之前执行该函数...
    • 数据正确性比性能更重要。这与获取结果的速度无关,而与结果的正确性有关。索引可用于用户选择日期范围的用户查询.
    • 好的,知道了。但是SELECT CONVERT_TZ('2004-01-01 12:00:00','Asia/Beijing','Europe/Helsinki'); 如果我的时区是 UTC 怎么办?
    • 您可以使用 SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','GMT') 输入位置名称只是为了说明清楚。你可以使用 GMT、UTC、PST 或任何其他时区作为输入。
    • 我认为你可以使用 convert_tz(time,'gmt','utc') 或 convert_tz(time'Asia/Beijing','Europe/London') 但不能混合使用。试试让我知道。
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多