У меня есть XML-файл миграции Liquibase, который создает столбцы с типом datetime
.
<createTable tableName = "foo">
<column name = "bar" type = "datetime"/>
</createTable>
К моему ужасу, сегодня я понял, что они создаются без часового пояса (timestamp without time zone
в PostgreSQL), и, похоже, нет какого-либо типа Liquibase, который вы могли бы использовать, который даст вам timestamp with time zone
. Есть ли способ справиться с этим, кроме блока <sql>
, который изменяет таблицу таким образом после первоначального создания таблицы:
<sql>
alter table foo alter column bar type timestamp with time zone;
</sql>
Спасибо.
Это сработало! Если вы сделаете это ответом, я могу принять его.
Я использую jhipster, который использует liquibase, и провел небольшой тест, создав простой проект с одним объектом, содержащим ZonedDateTime
LocalDateTime
Instant
, чтобы увидеть, как эти поля сопоставляются с соответствующими столбцами. Ну, все они сопоставляются со столбцом «дата и время». Должны ли мы предположить, что такое поведение неправильно, или использование даты и времени допустимо для всех упомянутых типов?
Если он не хранит часовой пояс, то это неправильно для ZonedDateTime и Instant. Это правильно для LocalDateTime.
Ответ, который был предоставлен в комментарии https://stackoverflow.com/users/330315/лошадь-без-имени, заключается в использовании timestamptz
собственного типа PostgreSQL:
<createTable tableName = "foo">
<column name = "bar" type = "timestamptz"/>
</createTable>
TL;DR: используйте timestamp with time zone
:
<column name = "bar" type = "timestamp with time zone"/>
Liquibase datetime
будет автоматически преобразована в тип временной метки целевой базы данных, но указать часовой пояс невозможно.
Liquibase примет timestamp with time zone
и передаст его как собственный тип (без преобразования), но, поскольку это стандартный тип SQL, он в любом случае будет принят любой стандартной базой данных (включая PostgreSQL).
timestamptz
— это специфическое для PostgreSQL сокращение для того же типа данных. Это не портативно.
Вы можете использовать нативные типы в теге
createTable
:type = "timestamptz"
-datetime
также является нестандартным типом.