当值全为零时,Postgres 时间戳字段不显示微秒分量

Postgres timestamp field not showing microseconds component when value is all zeros

上下文:我正在使用 Postgres 9.3 和 psql (PostgreSQL) 11.1。

鉴于以下 table:

create table ts_test(ts timestamp);

以下插入命令以微秒粒度显示时间:

INSERT INTO ts_test
VALUES
    (now()),
    (TIMESTAMP '2019-03-06 20:18:41.000001');
select * from ts_test;
             ts
----------------------------
 2019-03-06 20:40:35.062547
 2019-03-06 20:18:41.000001

但是,当插入一个全为零的时间戳作为微秒分量时,我观察到以下行为:

INSERT INTO ts_test VALUES (TIMESTAMP '2019-03-06 20:18:41.000000');
select * from ts_test;
             ts
----------------------------
 2019-03-06 20:40:35.062547
 2019-03-06 20:18:41.000001
 2019-03-06 20:18:41

我仔细阅读了文档,但对于为什么第三个条目中省略了微秒,我一头雾水。

TIMESTAMP '2019-03-06 20:18:41.000000'TIMESTAMP '2019-03-06 20:18:41'相同的值。全零小数位,这只是微不足道的噪音,没有存储在数据类型 timestamp(内部是一个 8 字节整数)。

如果你想保留原始文字,包括所有噪音、无关紧要的零和白色 space,你必须将它存储在像 text.

这样的字符串类型中

如果你想显示微秒时间戳,你可以使用to_char() with the template pattern US:

select to_char(ts, 'YYYY-MM-DD HH24:MI:SS:US') AS ts1 from ts_test;
             ts1
----------------------------
 2019-03-06 20:40:35.062547
 2019-03-06 20:18:41.000001
 2019-03-06 20:18:41.000000  -- !

这个结果当然是text。 (使用模式 MS 表示毫秒。)