我有一个视图,其中有一列年龄(例如 Age (CURRENT_TIMESTAMP,birth_dtm))。这工作正常,但是当通过 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 | 出生_dtm | 笼 | 年龄 |
---|---|---|---|
1 | 2024-03-22 08:23 | 20 天 07:31:44.651565 | 20 天 13:01:44.651323 |
2 | 2024-03-07 13:19 | 1 周一 4 天 02:35:44.651565 | 1 周一 4 天 08:05:44.651323 |
3 | 2024-03-24 01:06 | 18 天 14:48:44.651565 | 18天20:18:44.651323 |
所以我的问题是如何实现第 3 列 (view_test.c_age) 中的输出,如第 4 列所示?
请注意,根据时区亚洲/加尔各答,第 3 列和第 4 列之间的差异为 5.30。
问题的原因是 的数据类型选择有
timestamp without time zone
问题birth_dtm
。timestamp with time zone
将是适当的数据类型。由于您(或其他人)选择了
timestamp
,时间戳是不知道时区的,并且解释会根据读者的时区而有所不同。但出生是一个绝对事件,因此时区一定是隐含的。例如,如果数据库位于印度,并且仅存储印度应用程序的印度出生日期,则可以选择timestamp
并默认假设所有时间戳都位于印度时区。在这种情况下,您应该更改视图定义以反映该假设。否则,返回的数据将取决于观察者的时区。如果您所有的时间戳都是印度时间,则视图定义应该是