mysql - 如何修改现有表以添加时区

标签 mysql sql-server database-design architecture timezone

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

为了简化开发,我将此任务分为几个步骤,我确定的第一个步骤是根据服务器的时区将所有旧日期更改为 UTC。 (大部分位于同一个时区,所以这是我最好的猜测)

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

我将如何着手修改数据库/表以良好地支持它?

我的想法是:

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

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

最佳答案

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

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

存储偏移量不是必需的,除非您最终注意到从日期和时区到偏移量的转换太耗时。

关于mysql - 如何修改现有表以添加时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28146521/

相关文章:

php 更新查询不会使用 pdo 进行更新

sql-server - 如何找出哪个存储过程的哪一行发生了错误?

mysql - 复杂的 MYSQL 从 5 个表中选择

c# - 什么是有意义的数据类型来节省时间

sql - 内部连接到 select 语句,其中内部 select 语句的 where 子句引用外部 select?

database - Firebird 2.1 在某些数据库表中存储大量行是否有效?

sql - 创建表失败

php - 搜索barre php+mysql "Page not found"

mysql - 用于更新列值的 sql 查询/脚本

mysql - 无法按原样插入值 - 需要任何数据库的答案 - Oracle、Sql Server、MySql 等