Postgres预防带时区转换的时间戳

问题描述:

我有一个表格用于存储带时区的iso日期。我意识到日期应该“始终”存储为utc,但我对该规则有例外。时间戳与它们运行的​​服务器没有任何关系。我想能够存储这样的ISO日期: 2016-03-06T01:15:52-06:00 无论服务器的时区或其他任何我想要的时间戳返回为: 2016- 03-06T01:15:52-06:00Postgres预防带时区转换的时间戳

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

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

+0

_确实有一种方法可以将我的日期存储在一列中,并将其排除在最初创建的方式上:yes,“text”类型。 –

+0

听起来就好像你正在使用带时区的时间戳一样。如果你不希望它转换使用'timestamp'而不是 –

+0

@DanielVérité是的,但这会阻止我使用任何日期函数。 – TrippRitter

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

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

最简单的是第一个,你已经提出了。

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

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

请务必阅读this part of the Postgres docs

+0

那就是我害怕的。谢谢 :) – TrippRitter