【问题标题】:Postgres truncates trailing zeros for timestampsPostgres 截断时间戳的尾随零
【发布时间】:2019-06-27 13:47:30
【问题描述】:

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

您认为这是错误还是功能?

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

【问题讨论】:

    标签: postgresql timestamp milliseconds truncated


    【解决方案1】:

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

    如果您想查看所有三个数字,请使用to_char()

    SELECT to_char(dt.timestamp,'yyyy-mm-d hh24:mi:ss.ms') 
    FROM date_test dt;
    

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

    【讨论】:

    • 感谢您的建议,但不幸的是我不得不修改SQL语句。是否可以修改时间戳的默认格式?如果我能够修改每个连接的默认格式,那真是太好了。
    【解决方案2】:

    这只是演示的问题。

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

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

    我认为最好的解决方案是在 C++ 中修改您的解析器以接受任意数量的小数,并正确解析它们(带或不带尾随零)。 a_horse_with_no_name 的答案中给出了另一个应该可行的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2022-01-16
      • 2019-08-27
      • 2020-06-18
      相关资源
      最近更新 更多