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然后使用偏移列转换,非常混乱。当然,有一种方法可以将我的日期存储在一列中,并将其排除在最初创建的方式之外?
您提出的解决方案是正确的。或者更准确地说,它是几个正确的实现之一。以下任何一项都可以工作:
- 将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没有会话时区的概念,因此存在差异。
那就是我害怕的。谢谢 :) – TrippRitter
_确实有一种方法可以将我的日期存储在一列中,并将其排除在最初创建的方式上:yes,“text”类型。 –
听起来就好像你正在使用带时区的时间戳一样。如果你不希望它转换使用'timestamp'而不是 –
@DanielVérité是的,但这会阻止我使用任何日期函数。 – TrippRitter