2013-12-20 6 views
2

다가오는 생일을 찾는 기존 검색어를 jOOQ로 변환하려고합니다. 내 원래 쿼리 - MySQL을 사용하여 조금 단순화 -jOOQ로 다가오는 생일 찾기

SELECT COUNT(*) 
FROM people 
WHERE 
    DATE_ADD(people_dob, INTERVAL YEAR(CURDATE()) - YEAR(people_dob) YEAR) 
    BETWEEN CURDATE() and DATE_ADD(CURDATE(), INTERVAL 7 DAY) 

jOOQ를 사용하여 표현하려했지만 실패했습니다. 여기 쿼리를 중단 내 원래의 쿼리가 YEAR입니다 [DATE_ADD] [DATE_ADD]에 대한 expr_unit 인수이지만, 무엇

select count(*) 
from `people` 
where 
    date_add(`people`.`people_dob`, interval (extract(year from current_timestamp()) - extract(year from `people`.`people_dob`)) day) 
    between current_timestamp() and date_add(current_timestamp(), interval 7 day) 

로 변환하는 가까운, 불행하게도

context 
    .selectCount() 
    .from(PEOPLE) 
    .where(
     PEOPLE_DOB.add(year(currentTimestamp()).minus(year(PEOPLE_DOB))) 
     .between(currentTimestamp()).and(currentTimestamp().add(7))); 

로 얻었다 jOOQ에서 렌더링 한 것은 DAY입니다.

어떻게이 쿼리를 jOOQ로 변환 할 수 있습니까? 나는 현재 형식에 대해별로 신경 쓰지 않고, 같은 결과를 얻는 방법을 이해하기를 원합니다.

답변

1

문제를 해결하는 한 가지 방법은 where 절에서 String을 사용하는 것입니다. 나는 완전성을 위해 여기를 쓰고 있어요,하지만 난 지점이 골대를 벗어났습니다 생각 jOOQ

context. 
    selectCount(). 
    from(PEOPLE). 
    where("DATE_ADD(people_dob, INTERVAL YEAR(CURDATE()) - YEAR(people_dob) YEAR)" + 
     " BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()"). 
3

jOOQ의 Field.add() 방법은 어디 NUMBER (AN 경우

DATE + NUMBER 

... 오라클의 해석에 의해 영감을 Integer 또는 Double)는 일수입니다. 원하는 것은 주어진 날짜에 SQL 표준 INTERVAL YEAR TO MONTH을 추가하는 것과 같습니다. 일정한 간격을 추가하려면 jOOQ's YearToMonth interval type을 사용하여이 작업을 수행 할 수 있습니다. YearToMonth 유형도 java.lang.Number까지 확장되므로 직관적으로 Field.add()과 함께 사용할 수 있습니다.

public static <T extends java.util.Date> 
Field<T> dateInCurrentYear(Field<T> field) { 
    return DSL.field("DATE_ADD({0}, INTERVAL YEAR(CURDATE()) - YEAR({0}) YEAR)", 
        field.getDataType(), 
        field); 
} 

이 :

하면 가능성이 재사용 가능한 방법을 만들어 기존 jOOQ 3.2 API를 통해 Field<YearToMonth>, 당신이 그냥 일반 SQL에 의존에 더 나을 것이라고 믿는다 같은 생성 할 수있을 수도 있지만 #2727에 대한 유용한 기능 추가 일 수도 있습니다 ...

불행히도 날짜 시간 계산에 대한 다양한 SQL 언어의 해석은 표준화하기가 어렵습니다. 우리는 그곳에서 끊임없이 개선을하고 있지만 종종 일반 SQL은 방언 관련 날짜 시간 산술 표현을 작성하는 가장 좋은 방법입니다.