我有一个视图,其中有一个年龄列(例如Age(ORTNT_TIMESTamp,birth_dt)).这可以很好地工作,但当通过FDW使用时,会通过当前时区与GMT的偏差来抵消年龄.PostgreSQL文档指出postegerSQL_FDW将TIMEZONE设置为UTC.我们如何解决这个问题?

考虑以下表定义、表中的数据以及基于表的视图:

CREATE TABLE test
(
    id      serial  PRIMARY KEY,
    birth_dtm   TIMESTAMP
);
INSERT INTO test (birth_dtm) VALUES ('2024-03-22 08:23', '2024-03-07 13:19', '2024-03-24 01:06);
CREATE VIEW view_test AS
    SELECT  id, birth_dtm, AGE (current_timestamp, birth_dtm) c_age
    FROM    test;

现在,当我们在此VIEW可用的外部数据库中执行该声明时:

SELECT *, AGE (current_timestamp, birth_dtm)
FROM    FDB.view_test;

我们得到以下输出:

id birth_dtm c_age age
1 2024-03-22 08:23 20 days 07:31:44.651565 20 days 13:01:44.651323
2 2024-03-07 13:19 1 mon 4 days 02:35:44.651565 1 mon 4 days 08:05:44.651323
3 2024-03-24 01:06 18 days 14:48:44.651565 18 days 20:18:44.651323

那么我的问题是如何实现第4列所示的第3列(view_Test.c_age)中的输出?

Note that the difference is 5.30 between column 3 and column 4 is as per TIME ZONE Asia/Kolkata.

推荐答案

问题的原因是数据类型timestamp without time zonebirth_dtm的 Select 有问题.timestamp with time zone将是适当的数据类型.

由于您(或其他人) Select 了timestamp,因此时间戳是不知道时区的,并且解释将根据读者的时区而有所不同.但出生是一个绝对事件,因此时区必须是隐含假设的.例如,如果数据库位于印度并且仅为印度申请存储印度出生,则可以 Select timestamp并默认所有时间戳都被理解为位于印度时区.

在这种情况下,您应该更改视图定义以反映该假设.否则,返回的数据将取决于观察者的时区.如果您所有的时间戳都是印度时间,那么视图定义应该是

CREATE VIEW view_test AS
SELECT id, birth_dtm,
       AGE (current_timestamp, birth_dtm AT TIME ZONE 'Asia/Kolkata') c_age
FROM test;

Postgresql相关问答推荐

org.postgresql. util.PSQLException:使用docker + docker—compose + kafka + springboot时try 连接失败

处理Ruust-DIESEL中的Jsonb PostgreSQL列

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

如何在PostgreSQL中更改分区的表空间?

在PostGreSQL中获取最近日期的项目

docker-compose.yml用于使用postgres的spring-boot应用程序

带有附加组的时间刻度 interpolated_average

PostgreSql maintenance_work_mem 在索引创建期间增加

无法从 docker-compose 上的其他服务解析 postgres 主机名

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

从网址获取第一个字符串

PG::UndefinedTable:错误:relation "active_storage_blobs" does not exist

SQL数据库表中的多态性?

在 row_to_json 函数中 Select 查询

从 PostgreSQL 序列中 Select 多个 id

Django 1.9.2 AssertionError:database connection isn't set to UTC

Postgres 中是否有 MAX_INT 常量?

使用 PostgreSQL 的 Linq To Sql

由于不支持身份验证类型 10,无法连接到 Postgres DB

Postgresql 用随机值更新每一行