1

我有一个带有interval列的表,类似这样。

CREATE TABLE validity (
  window INTERVAL NOT NULL
);

假设存储的值是iso_8601格式的“P3DT1H”。当我尝试读取该值时,它以常规的 postgres 格式出现。

3 days 01:00:00

但是我想要iso_8601格式的值。我怎样才能实现它?

4

2 回答 2

1
so=# CREATE TABLE validity (
  w INTERVAL NOT NULL
);
CREATE TABLE
so=# insert into validity values ('3 days 01:00:00');
INSERT 0 1

你可能正在寻找 intervalstyle

so=# set intervalstyle to iso_8601;
SET
so=# select w From validity;
   w
--------
 P3DT1H
(1 row)

当然可以按事务/会话/角色/数据库/集群设置

于 2018-05-17T13:30:22.190 回答
0

您可以使用SET intervalstyle查询并将样式设置为iso_8601. 然后,当您输出结果时,它们将采用 ISO 8601 格式。

_, err := s.db.Exec("SET intervalstyle='iso_8601'")
res, err := s.db.Query("select interval '1d1m'")
// res contains a row with P1DT1M

如果您正在寻找一种方法来更改intervalstyle服务器级别的所有会话,您可以在配置文件中更新它:

-- connect to your psql using whatever client, e.g. cli and run
SHOW config_file;
-- in my case: /usr/local/var/postgres/postgresql.conf

编辑此文件并添加以下行:

intervalstyle = 'iso_8601'

在我的情况下,该文件已经有一个注释掉的行intervalstyle,它的值为postgres. 您应该更改它并重新启动服务。

这样你就不必每次运行查询时都从 golang 更改样式。

于 2018-05-17T13:29:34.007 回答