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