我有一个包含 500 多个表的大型应用程序,我必须将应用程序转换为时区感知(当前应用程序使用 new java.util.Date()
,GETDATE()
与服务器的时区)。即不支持任何时区。
为了简化开发,我将此任务分为几个步骤,我确定的第一个步骤是根据服务器的时区将所有旧日期更改为 UTC
。 (大部分位于同一个时区,所以这是我最好的猜测)
接下来,我需要修改数据库和应用程序代码以使用时区名称和偏移量以 UTC 格式保存所有日期,这就是我的问题所在...
我将如何着手修改数据库/表以良好地支持它?
我的想法是:
- 对于表中的每个日期/时间列,添加两个额外的列(用于 tz-name 和偏移量)
- 这感觉像是糟糕的设计
- 添加一个包含列
pk
、TABLE_NAME
、COL_NAME
、ROW_PK
、TZ_NAME
,TZ_OFFSET
- 虽然更便携,但该表最终将包含数百万行,因为它是将整个数据库的日期塞进一个表
- 为每个现有表(一对一)添加一个新表,其中包含 tz 名称和每个日期列的偏移量
- 虽然不可移植,但这似乎是最好的(关系)选项
有没有人有任何其他想法或最佳实践?
最佳答案
根据我的经验,您通常应该将数据存储为 UTC,并将相关时区放在单独的列中。拥有一个时区表并存储时区键是关系数据库的合理做法。
虽然在这种情况下,您的所有数据都已经是本地时间,因此在这种情况下,您可以将本地时间存储在时间列中,并为时区添加一列。这样您就不必转换数据库中已有的日期。
存储偏移量不是必需的,除非您最终注意到从日期和时区到偏移量的转换太耗时。
关于mysql - 如何修改现有表以添加时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28146521/