Поле с отметкой времени Postgres не показывает компонент микросекунд, когда все значения равны нулю - PullRequest
0 голосов
/ 06 марта 2019

Контекст: я использую Postgres 9.3 и psql (PostgreSQL) 11.1.

С учетом следующей таблицы:

create table ts_test(ts timestamp);

Следующие команды вставки отображают время с микросекундной гранулярностью:

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

Однако, когда вставляется метка времени со всеми нулями в качестве микросекундного компонента, я наблюдаю следующее поведение:

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

Я изучил документацию, но я рисую полный пробел относительно того, почему микросекунды опущены в третьей записи.

1 Ответ

0 голосов
/ 07 марта 2019

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  -- !

Этот результат, конечно, text.(Используйте шаблон MS для миллисекунд.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...