Postgres通过时区转换防止时间戳

时间:2016-03-06 15:54:28

标签: postgresql date datetime

我有一张桌子用于存储带时区的iso日期。我意识到日期应该"永远"存储为utc但我对该规则有例外。时间戳不以任何方式与其运行的服务器相关。我希望能够存储这样的iso日期: 2016-03-06T01:15:52-06:00 无论服务器的时区或其他任何我想要的时间戳返回为: 2016-03-06T01:15:52-06:00

目前,如果我插入一个iso日期,它会自动将其转换为服务器时区。我的上述日期转换为: 2016-03-06 07:15:52 + 00(服务器是utc)

我唯一能想到的是将时区偏移存储在一个单独的列中,将我的日期存储为utc然后使用偏移列进行转换,非常混乱。当然,有一种方法可以将我的日期存储在一个列中,并按照最初创建的方式将其取出?

1 个答案:

答案 0 :(得分:1)

您提出的解决方案是正确的。或者更确切地说,它是几个正确实现之一。以下任何一种都可以使用:

  • 将UTC时间戳存储在一个字段中,将偏移量存储在另一个字段中。
  • 本地时间戳存储在一个字段中,将偏移量存储在另一个字段中。
  • 将本地date存储在一个字段中,并将time with time zone存储在另一个字段中。 (虽然通常不鼓励time with time zone ...)
  • 将UTC时间戳存储在一个字段中,将本地时间戳存储在另一个字段中。

迄今为止最简单的是你已经提出的第一个。

我避免在text字段中存储时间戳,因为它们往往不能非常有效地搜索。

另请注意 - 如果您来自SQL Server后台,则可能会调用其datetimeoffset类型,该类型在字段中存储本地日期时间和偏移量,并在索引期间使用UTC等效项。认为Postgres和MySQL的timestamp with time zone具有相同的行为是很常见的,但他们不会这样做。他们只需使用会话时区转换为UTC或从UTC转换。 SQL Server没有会话时区的概念,因此存在差异。

请务必阅读this part of the Postgres docs