Есть ли в PostgreSQL собственный метод, чтобы «временная метка без часового пояса» не включала миллисекунды? - PullRequest
0 голосов
/ 18 февраля 2020

Я использую PostgreSQL 9.6.17. (Миграция с MySQL)

Программа java записывает даты в таблицу. Форматы даты следующие: 2019-01-01 09:00:00

Но это также может быть 2019-01-01 09:00:00.00 или 2019-01-01 09:00:00.000 при вставке в базу данных, что портит мое управление датой в моей программе при получении.

При вставке я бы хотел, чтобы все даты имели одинаковый формат: 2019-01-01 09:00:00. Тип данных, используемый столбцом: timestamp without a time zone.

Как мне сказать postgresql, чтобы не вводить миллисекунды в timestamp without timezone через конфигурацию или SQL запрос?

Эти типы данных do c не предоставляют никакой информации об этом.

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Цитата из руководства

время, метка времени и интервал принимают необязательное значение точности p, которое указывает количество дробных цифр, сохраняемых в поле секунд. По умолчанию нет явного ограничения точности. Допустимый диапазон значений p - от 0 до 6

Так что просто определите свой столбец как timestamp(0), например:

create table foo
(
   some_timestamp timestamp(0)
);

Если у вас есть существующая таблица с данными, вы может просто изменить столбец:

alter table some_table 
   alter column some_timestamp type timestamp(0);

Если вы сейчас вставите метку времени с миллисекундами, значение будет округлено для удаления миллисекунд.

Обратите внимание, что технически у вас все еще есть миллисекунды в сохраненном значении, но они всегда установлены на 0

0 голосов
/ 18 февраля 2020
  1. Извлекайте как метку времени, а в приложении, запрашивающем базу данных, управляйте точностью, как вам удобно. например. через JDB C вы получите Java LocalDateTime объект, в Python вы получите объект datetime.

  2. Если вы хотите получить метки времени в виде строк, есть доступно множество вариантов форматирования

    SELECT to_char(when, 'YYYY-MM-DD HH24:MI:SS') FROM mytable
    
  3. Удалите любые миллисекунды на входе, указав параметр точности для типа отметки времени :

    CREATE TABLE mytable (..., when TIMESTAMP(0));
    
0 голосов
/ 18 февраля 2020

Вы можете cast:

mytimestamptz::timestamp(0)

Это округлит результат с точностью до секунды. Если вы хотите усечь вместо:

date_trunc('second', mytimestamp)
...