Postgresql Postgres截断时间戳的尾随零

Postgresql Postgres截断时间戳的尾随零,postgresql,timestamp,milliseconds,truncated,Postgresql,Timestamp,Milliseconds,Truncated,Postgres(V11.3,64位,Windows)截断时间戳的尾随零。因此,如果我将时间戳“2019-06-12 12:37:07.880”插入表中,并将其作为文本postgres返回“2019-06-12:37:07.88”读回 Table date_test: CREATE TABLE public.date_test ( id SERIAL, "timestamp" TIMESTAMP WITHOUT TIME ZONE NOT NULL, CONSTRAINT pkey_

Postgres(V11.3,64位,Windows)截断时间戳的尾随零。因此,如果我将时间戳“2019-06-12 12:37:07.880”插入表中,并将其作为文本postgres返回“2019-06-12:37:07.88”读回

Table date_test:
CREATE TABLE public.date_test (
  id SERIAL,
  "timestamp" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
  CONSTRAINT pkey_date_test PRIMARY KEY(id) 
)
插入数据时的SQL命令:

INSERT INTO date_test (timestamp) VALUES( '2019-06-12 12:37:07.880' )
用于检索数据的SQL命令:

SELECT dt.timestamp ::TEXT FROM date_test dt

returns '2019-06-12 12:37:07.88'
<>你认为这是一个bug还是一个特性?


我真正的问题是:我正在运行C++程序中的查询,我必须把从数据库返回的数据转换成合适的数据类型。由于协议是基于文本的,所以我从数据库中读取的所有内容都是纯文本。解析时间戳时,我首先标记字符串,然后将每个标记转换为整数。由于毫秒部分被截断,最后一个标记是“88”,而不是“880”,转换“88”会产生另一个值,将“880”转换为整数。

这只是表示的问题

首先请注意,07.88秒和07.880秒是相同的时间量(同样是7.88秒和07.88000000秒)

PostgreSQL在内部以一种我们不应该关心的方式表示时间戳,只要它是一种明确的表示。当您检索时间戳时,它被格式化为一些字符串。这就是PostgreSQL显然选择不打印冗余尾随零的地方。所以说它截断了任何东西可能都不正确。它只是避免生成
0


我认为,好的解决方案是在C++中修改解析器以接受任何小数,并在没有零的情况下正确解析它们。答案中给出了另一个可行的解决方案,答案是一匹没有名字的马。

这是使用文本转换时的默认显示格式

如果要查看所有三位数字,请使用
to_char()


将返回
2019-06-12 12:37:07.880

谢谢您的建议,但很遗憾,我必须修改SQL语句。是否可以修改时间戳的默认格式?如果我能够修改每个连接的默认格式,那就太好了。
SELECT to_char(dt.timestamp,'yyyy-mm-d hh24:mi:ss.ms') 
FROM date_test dt;