2009-01-09 53 views
2

我在计划一个分布式应用程序系统,它将与不同类型的RDBMS进行通信。其中一个要求是对所有RDBMS类型的DateTime进行一致的处理。所有DateTime值必须以毫秒为单位,包括TimeZone信息并存储在单个列中。在不同的RDBMS中一致处理日期时间

由于不同的RDBMS处理的日期和时间不同,我担心在这种情况下我不能依赖他们的本地列类型,所以我必须想出一个不同的解决方案。 (如果我在这里错了,欢迎您向我展示方式。)

解决方案(无论它可能是什么)应理想地允许在SQL级别上轻松排序和比较。其他方面,如可读性和使用SQL日期时间函数的能力并不重要,因为这将全部由网关服务处理。

我玩弄了一个将我的DateTime值存储在unsigned largeint列类型(8字节)中的想法。我还没有确定所有关系型数据库管理系统(MSSQL,Oracle,DB2,PostgreSQL,MySQL,或许还有其他几个)实际上/有这样一个类型,但在这一点上,我只是假设他们这样做。

至于存储格式...例如,2009-01-01T12:00:00.999 + 01:00可以被存储为类似于?20090101120000999 ??,其落在8字节以下。

我能以这种方式存储的最小DateTime为0001-01-01T00:00:00.000 + xx:xx,最大值为8000-12-31T23:59:59.999 + xx:xx ,这给我一个足够的跨度。

由于maximum unsigned largeint值为18446744073709551615,因此我用以下3位数字(由A和BB标记)存储时区信息:AxxxxxxxxxxxxxxxxxBB。

考虑到0001..8000最大年的跨度,A可以是0或1,和BB可以在任何地方从00到99

而现在的问题:

  • 您对我提出的解决方案有何看法?它有优点还是仅仅是愚蠢的?

  • 如果没有更好的方法存在,你如何建议三个其余的数字用于TimeZone信息最好?

非常感谢您的帮助!

回答

1

我建议您存储自1970年以来的日期时间信息(Java风格),以毫秒为单位。 这是存储日期时间信息的标准方式,此外它在空间方面比您的建议更有效。因为在你的建议中,有些数字是“浪费的”,即月份数字只能存储00-12(而不是00-99)等等。 您没有指定什么是您的开发语言,但我相信您可以找到许多将日期转换为毫秒的代码片段。 如果你在.NET中开发,他们有类似的蜱概念。 (你也可以使用这个信息)

关于时区,我会添加另一列来存储只有TimeZone指示。

请记住,您选择的任何格式应该保持两个日期之间的一致性,即如果D1> D2,则格式化(D1)>格式(D2),这样您可以查询数据库以了解某些日期以来的更改,或者查询两个日期之间的更改

+0

Num。自1970年以来的毫秒数转换为使用6个字节作为当前日期时间值,其效率与我建议的8个字节完全相同,而不管浪费的数字。 关于您的最后一段关于一致性和查询......您认为我提出的解决方案不包括这些内容吗? Thx – aoven 2009-01-09 12:07:13