【问题标题】:How to modify existing tables for timezone addition如何修改现有表以添加时区
【发布时间】:2015-03-24 15:41:05
【问题描述】:

我有一个包含 500 多个表的大型应用程序,我必须将应用程序转换为时区感知(当前应用程序使用 new java.util.Date()GETDATE() 和服务器的时区)。即不支持任何时区。

我已将此任务组织成几个步骤以简化开发,我确定的第一个步骤是根据服务器的时区将所有旧日期更改为UTC。 (主要位于一个时区,所以这是我的最佳猜测)

接下来,我需要修改数据库和应用程序代码,以使用时区名称和偏移量保存所有 UTC 日期,这就是我的问题所在......

我将如何修改数据库/表以更好地支持这一点?

我的想法是:

  1. 对于表中的每个日期/时间列,添加两个额外的列(用于 tz-name 和偏移量)
    • 这感觉像是糟糕的设计
  2. 添加一个包含列pkTABLE_NAMECOL_NAMEROW_PKTZ_NAMETZ_OFFSET 的表
    • 虽然更便携,但此表最终将包含数百万行,因为它是将整个数据库的日期塞进一张表中
  3. 为每个现有表(一对一)添加一个新表,其中包含 tz 名称和每个日期列的偏移量
    • 虽然不可移植,但这似乎是最好的(关系)选项

有没有人有任何其他想法或最佳实践?

【问题讨论】:

  • 为什么要将时区存储在数据库中。我希望后端只使用一个时区,即 UTC,并在必要时在前端进行转换,但不存储它。
  • 基本上是为了获取数据保存的时区,我不能假设用户不会更改时区,我需要数据库中每条记录的准确历史时间
  • 我建议:如果用户添加日期/时间信息,将用户本地时区转换为UTC并将UTC保存在数据库中。如果 GUI 向用户显示一个值,则在显示期间将其转换为他们的本地时间。
  • 谢谢,我完全理解,我的问题是如何构建我现有的数据库以使用当前数据保存时区名称
  • 听起来您正在寻找datetimeoffsettimestamp with timezone 类型-mysql 都不支持这两种类型。您可能需要存储多个列。

标签: mysql sql-server database-design architecture timezone


【解决方案1】:

根据我的经验,您通常应该将数据存储为 UTC,相关时区位于单独的列中。拥有一个时区表并存储时区键是关系数据库的合理做法。

不过,在这种情况下,您的所有数据都已经是本地时间,因此在这种情况下,您可以将本地时间存储在时间列中,并为时区添加一列。这样您就不必转换数据库中已有的日期。

没有必要存储偏移量,除非您最终注意到从日期和区域转换为偏移量太耗时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2019-09-06
    • 2011-12-02
    • 1970-01-01
    • 2022-11-17
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多