Подтвердить что ты не робот

Выполнение математики даты/времени в HQL?

Я ищу, как выполнять математику даты/времени в запросе HQL. В частности, как мне добавить или вычесть (x) количество времени из результата функции current_timestamp()? Или мне нужно отказаться от SQL для этого и надеяться, что всякая база данных будет поддерживаться?

Пример запроса HQL:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

Я могу определить параметр timeToSubtract как любой конкретный элемент, хотя ничего большего, чем часы, было бы нежелательным, и секунды были бы наиболее желательными.

ПОДТВЕРЖДЕНИЕ: Я понимаю, что это легко сделать за пределами запроса. Но по философским соображениям, допустим, важно использовать время сервера базы данных, а не время системного запроса. Практический пример: я запрашиваю автоматическую метку времени для всех записей, сделанных в течение последнего (х) количества времени. Поскольку временная метка создается системой базы данных, важно также использовать текущее время базы данных.

4b9b3361

Ответ 1

Если вам нужно время сервера базы данных, вы можете сначала выполнить простой запрос hql, чтобы получить метку времени, а затем вычислить maxTimestamp в java и передать выбранную временную метку и рассчитанный maxTimeStamp в запрос, подобный запросу ccclark.

Ответ 2

Зачем вам нужно делать это в запросе? Почему бы просто не обработать его в Java-коде.

например:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

А затем просто установите параметры.

Ответ 3

Вы можете определить синтаксис, чтобы сделать это, используя SQL в своей базе данных, а затем определить функцию в пользовательском HibernateDialect. Например, нам нужна функция дня недели, которая не является стандартным SQL. Мы подклассифицировали диалект для каждой базы данных, а затем добавили следующую строку:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

В вашем случае вы можете использовать функцию date_diff, которая может быть определена как? -? в некоторых базах данных или что-то другое в других. Таким образом, вам не нужно писать исходный SQL в свой запрос, и если вам когда-либо понадобится переключать базы данных, вы просто сопоставляете функцию по-разному на своем диалекте.

Ответ 4

Должен ли быть HQL? Я бы, вероятно, переключился на спящий режим и использовал:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )