Запрос даты с Hibernate на столбце меток времени в PostgreSQL - PullRequest
6 голосов
/ 30 марта 2010

В таблице есть столбец меток времени. Пример значения в этом может быть 2010-03-30 13:42:42. В Hibernate я делаю запрос диапазона Restrictions.between ("имя-столбца", fromDate, toDate).

Отображение Hibernate для этого столбца выглядит следующим образом.

<property name="orderTimestamp"  column="order_timestamp" type="java.util.Date" />

Допустим, я хочу выяснить все записи с датой 30 марта 2010 г. и 31 марта 2010 г. Запрос диапазона в этом поле выполняется следующим образом.

Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30");
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31");
Expression.between("orderTimestamp", fromDate, toDate);

Это не работает.

Запрос преобразуется в соответствующие временные метки как "2010-03-30 00:00:00" и "2010-03-31 00:00:00". Таким образом, все записи за 31 марта 2010 года игнорируются.

Простым решением этой проблемы может быть указание конечной даты как "2010-03-31 23:59:59". Но я хотел бы знать, есть ли способ сопоставить только часть даты в столбце отметки времени.

Кроме того, Expression.between() включает оба предела? Документация не проливает свет на это.

Ответы [ 4 ]

3 голосов
/ 30 марта 2010

, я хотел бы знать, есть ли способ сопоставить только часть даты в столбце отметки времени.

Если вам не нужен TIMESTAMP, используйте ДАТУ (и не следует ли вам использовать type="date"?).

Кроме того, Expression.between () включает оба предела?

Кажется, что поведение оператора SQL BETWEEN зависит от базы данных . С PosgresQL, МЕЖДУ выражением:

x BETWEEN y AND z

семантически эквивалентен:

y <= x AND x <= z

т.е. включительно.

1 голос
/ 30 марта 2010

«2010-03-31 23:59:59». Граничное условие потенциально опасно: если бы в системе была транзакция между 23:59:59 и 00:00:00, вы бы ее пропустили. Если у вас достаточно транзакций в день и достаточно продолжительный период, отчет нарушится, и вы потратите часы, чтобы выяснить, почему.

PostgreSQL between включает ограничения , поэтому было бы небезопасно устанавливать дату окончания на 2010-04-01 00:00:00. Для уверенности используйте lt () и gt ().

0 голосов
/ 05 февраля 2013

Используйте приведение (your_data, date), помните, что второй аргумент функции приведен ниже, иначе он не будет работать.

Атт .: Самуил \ Майкон

0 голосов
/ 30 марта 2010

Может быть, вы можете CAST orderTimestamp на ДАТУ. HQL имеет поддержку для этого.

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