Выполнение математики даты/времени в HQL?
Я ищу, как выполнять математику даты/времени в запросе HQL. В частности, как мне добавить или вычесть (x) количество времени из результата функции current_timestamp()
? Или мне нужно отказаться от SQL для этого и надеяться, что всякая база данных будет поддерживаться?
Пример запроса HQL:
FROM RandomThing
WHERE randomTime IS NOT NULL AND
randomTime >= current_timestamp() AND
randomTime <= (current_timestamp() + :timeToAdd)
Я могу определить параметр timeToSubtract как любой конкретный элемент, хотя ничего большего, чем часы, было бы нежелательным, и секунды были бы наиболее желательными.
ПОДТВЕРЖДЕНИЕ: Я понимаю, что это легко сделать за пределами запроса. Но по философским соображениям, допустим, важно использовать время сервера базы данных, а не время системного запроса. Практический пример: я запрашиваю автоматическую метку времени для всех записей, сделанных в течение последнего (х) количества времени. Поскольку временная метка создается системой базы данных, важно также использовать текущее время базы данных.
Ответы
Ответ 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 )