【问题标题】:MySQL Timezone for different rows不同行的MySQL时区
【发布时间】:2014-04-20 13:31:10
【问题描述】:

我陷入了这个逻辑。我正在做一个消息调度项目,我有来自不同国家的客户。让我们考虑亚洲(不遵守夏令时)和美国/纽约(遵守夏令时)。

现在,我正在编写以下查询以获取距当前时间 10 分钟间隔内的时间表:

select message,subject,person_or_group,customer_id from common_schedule where reminder_type_1 in('beforedays','beforehours') and now() between cast(reminder_time1 as datetime) and addtime(cast(reminder_time1 as datetime),'00:10:00')

现在,如果我们有两条记录,一条是纽约(夏令时),一条是新德里:印度不是夏令时,我会得到纽约的错误数据,因为应该减去 1 小时它。

还假设表 DY(夏令时)中有一个额外的列,其值为“y”或“n”。

【问题讨论】:

    标签: mysql save dst


    【解决方案1】:

    一些事情:

    • 当你使用MYSQL的now()函数(docs here)时,返回的是当前时区的值。

    • 可以为系统设置全局时区,也可以为每个数据库连接设置时区 (docs here)。

    • 您可以使用 MYSQL 的 CONVERT_TZ 函数 (docs here) 从一个时区转换到另一个时区,或在本地时区和 UTC 之间转换。

    • DST 的布尔标志绝不是一个好主意,因为世界各国在不同的时间点遵守 DST。此外,国家/地区经常更改他们关于何时遵守 DST 的规则。所有不同的规则都包含在时区数据中,当您使用像 America/New_York 这样的时区时会引用这些数据。

    • 为了将来安排活动,您可能应该存储活动的本地时间和它所属的时区。

    • 根据您正在处理的数据量,您可能考虑一种策略,该策略预先计算 UTC 时间以从计划的本地时间开始运行。然后,通过将 UTC“现在”与预先计算的列进行比较,您可以更轻松地定位下一个要运行的任务。但是,您应该准备好定期重新评估等效的 UTC,或者至少在您收到时区数据更新时重新评估。

    • 未来事件的安排本来就很困难。另请参阅我之前就该主题撰写的帖子:herehereherehere

    【讨论】:

    • 感谢 Matt,我从软件级别处理了它,因为 EST/EDT 也在那里,我不想在数据库级别进行所有这些复杂的计算。
    • 这通常是最好的策略。
    猜你喜欢
    • 2011-06-23
    • 2010-11-18
    • 2016-08-23
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多