2009-03-12 3 views
16

HQL 쿼리에서 날짜/시간 계산을 수행하는 방법을 모색 중입니다. 특히, current_timestamp() 함수의 결과에서 (x) 시간을 더하거나 빼는 방법은 무엇입니까? 또는이 작업을 수행하기 위해 SQL에 들어가야하며, 실행중인 데이터베이스가 무엇이든 지원하기를 바랍니다.HQL에서 날짜/시간 수학 수행하기

HQL 질의 예 : 시간보다 더 아무것도 바람직하지 않을 것이지만, 특정 단위로 timeToSubtract 매개 변수, 그리고 초 가장 바람직 할 것이다 :

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

난을 정의 할 수 있습니다.

CLARIFICATION :이 작업은 쿼리 외부에서 쉽게 수행 할 수 있습니다. 그러나 철학적 인 이유 때문에 쿼리하는 시스템의 시간보다는 데이터베이스 서버의 시간을 사용하는 것이 중요하다고 가정 해 봅시다. 실제 예 : 마지막 (x) 시간 내에 작성된 모든 항목에 대한 자동 시간 소인을 조회합니다. 타임 스탬프는 데이터베이스 시스템에 의해 만들어 지므로 데이터베이스의 현재 시간도 사용하는 것이 중요합니다.

+0

timeToAdd가 매개 변수가 아니라 같은 행의 열을 제외하고 같은 행과 테이블에 두 번째 쿼리를 작성하는 것을 의미하지 않는다는 점을 제외하고는 동일한 것을 찾고 있습니다. – James

답변

3

, 당신은 먼저 타임 스탬프를 가져온 다음 자바에서 maxTimestamp을 계산하고 반입을 통과하는 간단한 HQL 쿼리를 할 수있는 : 나는 아마 최대 절전 모드 기준 및 사용하도록 전환 할 것 타임 스탬프와 계산 된 maxTimeStamp를 ccclark 중 하나와 같은 쿼리에 추가합니다.

+0

이것이 가장 일반화되고 구현하기 쉬운 솔루션이라고 생각합니다. 감사. – jdmichal

10

왜 쿼리에서 수행해야합니까? Java 코드에서 처리하지 않는 것이 좋습니다. 예를 들어

:

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

그리고 그냥 매개 변수를 설정합니다.

+0

좋은 답변입니다. 나는 나의 대답으로 질문에 대한 설명을했다. – jdmichal

+2

Java 코드가 동일한 시계에서 실행되지 않을 수 있고 일부 쿼리에서 몇 초의 차이가 발생해도 문제가 발생할 수 있습니다. – Quartz

4

데이터베이스에서 SQL을 사용하여 구문을 결정한 다음 사용자 정의 HibernateDialect 내에 함수를 정의 할 수 있습니다. 예를 들어 표준 SQL이 아닌 평일 함수가 필요했습니다. 당신이 정의 될 수있는 date_diff라는 기능을 사용할 수 있습니다 귀하의 경우에는

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

: 우리는 각 데이터베이스의 방언을 하위 클래스 다음과 같은 라인을 추가? -? 일부 데이터베이스 또는 다른 다른 데이터베이스에서. 그렇게하면 쿼리에 원시 SQL을 쓸 필요가 없으며 데이터베이스를 전환해야하는 경우 방언에서 함수를 다르게 매핑하기 만하면됩니다.

1

HQL이어야합니까? 데이터베이스 서버의 시간을 필요로하는 경우

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

두 문을 HQL 쿼리와 비교하여 비교하는 것의 차이점은 무엇입니까? – jdmichal

+0

이 솔루션은 CriteriaQuery API와 함께 작동하며 이미이 접근법을 따르고있는 경우 유용합니다. –