Postgres усекает конечные нули для отметок времени - PullRequest
0 голосов
/ 27 июня 2019

Postgres (V11.3, 64bit, 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» в целое число.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Это формат отображения по умолчанию при использовании приведения к тексту.

Если вы хотите увидеть все три цифры, используйте 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

0 голосов
/ 27 июня 2019

Это только вопрос презентации.

Первое замечание: 07,88 секунды и 07,880 секунды - это одинаковое количество времени (также 7,88 и 07,880000000).

PostgreSQL внутренне представляет собойотметка времени таким образом, что мы не должны беспокоиться, пока это однозначное представление.Когда вы получаете метку времени, она форматируется в какую-то строку.Именно здесь PostgreSQL, по-видимому, решает не печатать избыточные конечные нули.Так что, вероятно, даже неправильно говорить, что это что-то усекает.Он просто воздерживается от генерации 0.

. Я думаю, что хорошим решением было бы изменить ваш синтаксический анализатор в C ++ так, чтобы он принимал любое количество десятичных знаков и анализировал их правильно с конечными нулями и без них.Другое решение, которое должно работать, дано в ответе a_horse_with_no_name.

...