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

时间:2015-01-26 08:09:00

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

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

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

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

我将如何修改数据库/表格以便以良好的方式支持这一点?

我的想法是:

  1. 对于表格中的每个日期/时间列,添加两个额外的列(对于tz-name和amp; offset)
    • 这感觉就像糟糕的设计
  2. 添加一个包含pkTABLE_NAMECOL_NAMEROW_PKTZ_NAMETZ_OFFSET列的表格
    • 虽然更具可移植性,但是这个表将包含数百万行,因为它是将整个数据库的日期塞进一张表中
  3. 为每个现有表(一对一)添加一个新表,其中包含tz-names和每个日期列的偏移量
    • 虽然不便携,但这似乎是最好的(关系)选项
  4. 有没有人有其他想法或最佳做法?

1 个答案:

答案 0 :(得分:1)

根据我的经验,您通常应将数据存储为UTC,并将相关时区存储在单独的列中。拥有时区表和存储时区密钥是合理的关系数据库。

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

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