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

Mr.*_*. S 3 postgresql psql

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

给出下表:

create table ts_test(ts timestamp);
Run Code Online (Sandbox Code Playgroud)

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

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

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

INSERT INTO ts_test VALUES (TIMESTAMP '2019-03-06 20:18:41.000000');
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

我已经仔细阅读了文档,但对于为什么第三个条目中省略了微秒,我完全一片空白。

Erw*_*ter 6

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

如果您想保留原始文字,包括所有噪音、无意义的零和空格,则必须将其存储在字符串类型中,例如text.

如果您想显示以微秒为单位的时间戳,您可以使用to_char()模板模式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  -- !
Run Code Online (Sandbox Code Playgroud)

这个结果是text理所当然的。MS(使用毫秒模式。)