当数据类型为WITH TIME ZONEWITHOUT TIME ZONE时,PostgreSQL中存储的时间戳值是否不同?可以用简单的测试用例来说明这些差异吗?

推荐答案

差异被覆盖在the PostgreSQL documentation for date/time types.是的,TIMETIMESTAMP的治疗在WITH TIME ZONEWITHOUT TIME ZONE之间有所不同.它不会影响值的存储方式;它会影响人们对它们的解读.

在文档中,时区对这些数据类型的影响为covered specifically.差异源于系统对价值的合理了解:

  • 当时区作为值的一部分时,该值可以在客户端中呈现为本地时间.

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

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

  • 客户端中的时区设置.
  • 值的数据类型(即WITH TIME ZONEWITHOUT TIME ZONE).
  • 是否使用特定时区指定该值.

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

foo=> SET TIMEZONE TO 'Japan';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+09
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 06:00:00+09
(1 row)

foo=> SET TIMEZONE TO 'Australia/Melbourne';
SET
foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 00:00:00+11
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP;
      timestamp      
---------------------
 2011-01-01 00:00:00
(1 row)

foo=> SELECT '2011-01-01 00:00:00+03'::TIMESTAMP WITH TIME ZONE;
      timestamptz       
------------------------
 2011-01-01 08:00:00+11
(1 row)

Postgresql相关问答推荐

"错误:无法创建用户:错误:关系\users\违反了非空约束

在同一 Select 列表中两次使用jsonb_arrayElements()是否安全?

如何确定要与给定转储文件一起使用的pg_Restore版本?

PostgreSQL plpgsql函数问题

无法使用PGx连接到Postgres数据库AWS RDS

为什么在 PostgreSQL 中忽略查询超时?

Cloud SQL 时间点 数据驻留

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

全文搜索(Postgres)与Elastic search

Flask-SQLAlchemy db.session.query(Model) 与 Model.query

如何查询存储在数组中的 Rails ActiveRecord 数据

错误:CASE types character varying and numeric cannot be matched

从 PostgreSQL 中的时间戳获取日期

如何使用 psql 执行 *.sql 文件

仅在存在时重命名列

在 PostgreSQL 中将列数据类型从 Text 更改为 Integer

获取json列键为空的记录

在 PGAdmin 中搜索所有功能的文本

基于秒的 Postgresql 日期差异

pg_restore 目录错误