Запрос даты с переходом в спящий режим в столбце Timestamp в PostgreSQL

StackOverflow https://stackoverflow.com/questions/2543510

Вопрос

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

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

<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". Но я хотел бы знать, есть ли способ сопоставить только часть даты столбца timestamp.

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

Нет правильного решения

Другие советы

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

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

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

Похоже, что поведение оператора SQL BETWEEN является зависит от базы данных.С помощью PosgreSQL выражение BETWEEN:

x BETWEEN y AND z

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

y <= x AND x <= z

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

Сообщение "2010-03-31 23:59:59". Пограничное состояние потенциально опасно:если бы в системе была транзакция между 23:59:59 и 00:00:00, вы бы ее пропустили.Если у вас достаточно транзакций в день и за достаточно длительный период, отчет будет прерываться, и вы потратите часы, чтобы выяснить причину.

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

Может быть, вы сможете ПРИВЕСТИ orderTimestamp к ДАТЕ.HQL есть ли поддержка для этого.

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

Att.:Сэмюэль\Майкон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top