Сравнение метки времени PostgreSQL без часового пояса и java.util.Date с часовым поясом

2

Я хотел бы знать, как будет выполняться сравнение в следующем запросе:

StringBuilder queryStr = new StringBuilder();
queryStr.append("SELECT o FROM PRDBook as o WHERE ")
        .append("o.publicationDate < :now");

Query query = entityManager.createQuery(queryStr.toString());
Date now = new Date();
query.setParameter("now", now);

В базе данных column publicationDate имеет timestamp without time zone типа timestamp without time zone. Примерное значение в этом столбце:

2018-03-01 18:00:00

Результатом now.toString() является:

Wed Aug 22 16:14:03 CEST 2018

Будет ли выполняться сопоставление между указанными данными таким образом:

2018-03-01 18:00:00 <2018-08-22 16:14:03

или так:

2018-03-01 18:00:00 <2018-08-22 14:14:03

  • 1
    У java.util.Date нет часового пояса; это просто абстрактный момент времени. Вы пытались запустить свой код, чтобы увидеть, что на самом деле происходит? Итак, я голосую за первую версию, которая и будет.
  • 0
    @TimBiegeleisen Я запустил код с книгой в базе данных с датой публикации 2018-08-22 16:58:17. Значение сейчас было Ср. 22 августа 16:59:11 CEST 2018. Указанный объект книги появился в списке результатов. Похоже, что вы проголосовали правильно.
Теги:
hibernate
hql

1 ответ

1
Лучший ответ

Интересный вопрос.

Когда драйвер PostgreSQL JDBC читает столбец типа timestamp without time zone, он обычно может читать его в java.sql.Timestamp или java.util.Date.

Если вы решите прочитать его на java.util.Date (ваш случай) Драйвер PostgreSQL JDBC автоматически добавляет к нему локальный часовой пояс JVM. Это имеет смысл, поскольку вся точка столбца типа timestamp without time zone должна рассматриваться как "локальная" метка времени.

И наоборот, когда вы отправляете java.util.Date в базу данных, он сразу же удаляет часовой пояс. Поэтому условие запроса примет форму:

2018-03-01 18:00:00 <2018-08-22 16:14:03

Взаимозависимо это означает, что он рекомендовал установить часовой пояс JVM явно, чтобы убедиться, что драйвер JDBC повторно собирает timestamp without time zone базы данных timestamp without time zone в java.util.Date правильным способом.

В противном случае разные серверы в разных часовых поясах, читающих одну и ту же строку в одной базе данных, будут интерпретировать эту временную метку как другой момент времени. Тем не менее, это, вероятно, не должно быть допустимым вариантом использования приложения, которое использует "локальные" временные метки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню