上下文:我正在使用 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)
我已经仔细阅读了文档,但对于为什么第三个条目中省略了微秒,我完全一片空白。
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(使用毫秒模式。)