PostgreSQL中带/不带时区的时间戳之间的差异

当数据类型为带时区的与不带时区的时,PostgreSQL中存储的时间戳值是否不同?可以用简单的测试用例来说明差异吗

日期/时间类型的PostgreSQL文档中介绍了这些差异。是的,时间时间戳的处理方式在带时区的或不带时区的之间有所不同。它不影响值的存储方式;它会影响人们对它们的理解

时区对这些数据类型的影响在文档中有专门介绍。差异来自于系统合理了解的价值:

  • 使用时区作为值的一部分,可以在客户端中将值呈现为本地时间

  • 如果没有时区作为值的一部分,那么明显的默认时区是UTC,因此会针对该时区进行渲染

行为的不同至少取决于三个因素:

  • 客户端中的时区设置
  • 值的数据类型(即带时区的或不带时区的
  • 是否使用特定时区指定该值

以下是涵盖这些因素组合的示例:

foo=>将时区设置为“日本”;
设置
foo=>选择“2011-01-01 00:00:00”::时间戳;
时间戳
---------------------
2011-01-01 00:00:00
(1排)
foo=>选择“2011-01-01 00:00:00”:带时区的时间戳;
时间戳
------------------------
2011-01-01 00:00:00+09
(1排)
foo=>选择“2011-01-01 00:00:00+03”::时间戳;
时间戳
---------------------
2011-01-01 00:00:00
(1排)
foo=>选择“2011-01-01 00:00:00+03”::带时区的时间戳;
时间戳
------------------------
2011-01-01 06:00:00+09
(1排)
foo=>将时区设置为“澳大利亚/墨尔本”;
设置
foo=>选择“2011-01-01 00:00:00”::时间戳;
时间戳
---------------------
2011-01-01 00:00:00
(1排)
foo=>选择“2011-01-01 00:00:00”:带时区的时间戳;
时间戳
------------------------
2011-01-01 00:00:00+11
(1排)
foo=>选择“2011-01-01 00:00:00+03”::时间戳;
时间戳
---------------------
2011-01-01 00:00:00
(1排)
foo=>选择“2011-01-01 00:00:00+03”::带时区的时间戳;
时间戳
------------------------
2011-01-01 08:00:00+11
(1排)

发表评论