문제

HQL 쿼리 내에서 날짜/시간 수학을 수행하는 방법을 찾고 있습니다. 구체적으로, (x)의 양을 어떻게 추가하거나 빼는 방법은 current_timestamp() 기능? 아니면 이것에 대해 SQL에 삭제해야하고 어떤 데이터베이스가 실행되고 있는지를 바라십니까?

HQL 쿼리 예 :

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

시간보다 큰 것은 바람직하지 않지만 초가 가장 바람직 할 것입니다.

설명 : 나는 이것이 쿼리 밖에서 쉽게 수행 할 수 있다는 것을 알고 있습니다. 그러나 철학적 이유로 쿼리 시스템의 시간보다는 데이터베이스 서버의 시간을 사용하는 것이 중요하다고 가정 해 봅시다. 실제 예 : 마지막 시간 내에 이루어진 모든 항목에 대해 자동 타임 스탬프를 쿼리하고 있습니다. 타임 스탬프는 데이터베이스 시스템에 의해 만들어 지므로 데이터베이스의 현재 시간을 사용하는 것이 중요합니다.

도움이 되었습니까?

해결책

데이터베이스 서버의 시간이 필요한 경우 먼저 간단한 HQL 쿼리를 수행하여 타임 스탬프를 얻은 다음 Java의 MaxtImestamp를 계산하고 계산 된 MAXTIMESTAMP를 CCCLARK의 QUERY로 전달할 수 있습니다.

다른 팁

쿼리에서 왜해야합니까? Java 코드로 처리하지 않겠습니까?

예를 들어:

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

그런 다음 매개 변수를 설정하십시오.

데이터베이스에서 SQL을 사용하여 구문을 결정한 다음 사용자 지정 최대 절전 모드 내에서 함수를 정의 할 수 있습니다. 예를 들어, 표준 SQL이 아닌 평일 기능이 필요했습니다. 각 데이터베이스의 방언을 서브 클래징 한 다음 다음과 같은 선을 추가했습니다.

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

귀하의 경우 DATE_DIFF라는 기능을 사용할 수 있습니까? -? 일부 데이터베이스 또는 다른 데이터베이스에서 다른 것. 이렇게하면 쿼리에 원시 SQL을 쓸 필요가 없으며 데이터베이스를 전환 해야하는 경우 방언에 기능을 다르게 매핑합니다.

HQL이어야합니까? 아마도 최대 절전 모드 기준으로 전환하고 사용합니다.

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top