복붙노트

[SPRING] 두 날짜 간의 레코드를 조회하는 HQL

SPRING

두 날짜 간의 레코드를 조회하는 HQL

리포지토리 / DAO 클래스에서이 HQL 쿼리를 빌드 할 수 있도록 Date1과 Date2 사이에 DateAdded 또는 Date1과 Date2 사이에 LastSeen이있는 Spring / Hibernate 앱에서 HQL을 사용하여 모든 고객 레코드를 쿼리하려고합니다.

sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN  '"+startDate+"' AND '"+endDate+"'").list();

startDate 및 endDate를 확인하도록 앱을 디버깅했으며 다음과 같이 전송 된 것으로 나타났습니다.

startDate : Wed Jan 22 01:16:57 HKT 2014

endDate : Wed Jan 29 01:16:57 HKT 2014

DB에서, 나는이 레코드 DateAdded와 LastSeen이 다음과 같이 적어도이 쿼리를 충족시키는 레코드가 100 % 확실하다는 것을 확신합니다.

2014-01-23 15:33:38

2014-01-25 15:33:38

그래서 누군가 내가 잘못하고있는 것을 나에게 말해 주실 수 있습니까?

해결법

  1. ==============================

    1.

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String frmDate = format.parse(startDate);
    String enDate = format.parse(endDate);
    sessionfactory.getCurrentSession()
    .createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
    .setParameter("stDate", frmDate)
    .setParameter("edDate", enDate)
    .list();
    

    이것이 도움이되기를 바랍니다!

  2. ==============================

    2.이것은 오래된 게시물이지만 누군가가 도움이 될 것이라고 생각했습니다. .setTimeStamp를 설정하면 트릭을 수행해야합니다.

    이것은 오래된 게시물이지만 누군가가 도움이 될 것이라고 생각했습니다. .setTimeStamp를 설정하면 트릭을 수행해야합니다.

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String frmDate = format.parse(startDate);
    String enDate = format.parse(endDate); 
    sessionfactory.getCurrentSession()
    .createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
    .setTimestamp("stDate", frmDate)
    .setTimestamp("edDate", enDate)
    .list();
    
  3. ==============================

    3.

    SimpleDateFormat sf=new SimpleDateFormat("dd-MM-YYYY");
    String fromDate=null;
    String toDate=null;
    fromDate=sf.format(startDate);
    toDate=sf.format(endDate);
    sessionfactory.getCurrentSession().createQuery("from Customer where dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"'");
    
  4. ==============================

    4.나는 비슷한 문제가 있었다. 종료일 (1 월 29 일 수요일)을 사용하면 시스템은 1 월 29 일 Wed를 선택합니다.이 경우를 피하기 위해 종료일에 하루를 추가 할 수 있습니다. 또한 시작일에 문제가없는 이유를 설명합니다.

    나는 비슷한 문제가 있었다. 종료일 (1 월 29 일 수요일)을 사용하면 시스템은 1 월 29 일 Wed를 선택합니다.이 경우를 피하기 위해 종료일에 하루를 추가 할 수 있습니다. 또한 시작일에 문제가없는 이유를 설명합니다.

    놀랍게도이 문제는 최대 절전 모드를 사용할 때 존재하지 않습니다.

  5. ==============================

    5.

    SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
        Calendar c = Calendar.getInstance();
        c.setTime(new Date()); // Now use today date.
        c.add(Calendar.DATE, 90);
        Date fromDate = null, toDate = null;
        String fromDateStr = formatter.format(new Date());
        String toDateStr = formatter.format(c.getTime());
        try {
            fromDate = formatter.parse(fromDateStr);
            toDate = formatter.parse(toDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        query.setParameter("stDate", fromDate);
        query.setParameter("edDate", toDate);
    
  6. ==============================

    6.BETWEEN을 사용할 때 "setDate"가 매개 변수로 전달 된 HQL 날짜 값을 자르고시, ​​분, 초를 무시한다는 것을 아는 것이 중요합니다. "setDate"를 사용하면 지정된 날짜의 자정 사이로 날짜 간격이 해석되므로 다른 날짜의 날짜 사이에 HQL 쿼리를 확인하는 경우 특히주의해야합니다.

    BETWEEN을 사용할 때 "setDate"가 매개 변수로 전달 된 HQL 날짜 값을 자르고시, ​​분, 초를 무시한다는 것을 아는 것이 중요합니다. "setDate"를 사용하면 지정된 날짜의 자정 사이로 날짜 간격이 해석되므로 다른 날짜의 날짜 사이에 HQL 쿼리를 확인하는 경우 특히주의해야합니다.

    해결책은 "setDate"대신 "setParameter"를 사용하여 HQL 날짜 값을 날짜와 시간으로 해석하도록하는 것입니다.

    http://www.coding-dude.com/wp/java/hql-date-datetime-quick-tip/에 관심이있는 사람들을 위해 내 사이트에 몇 가지 예가 있습니다.

  7. ==============================

    7.다음과 같이 날짜 필터와 날짜 필드와 동일한 방식으로 @JsonFormat 주석을 추가해야합니다.

    다음과 같이 날짜 필터와 날짜 필드와 동일한 방식으로 @JsonFormat 주석을 추가해야합니다.

    Class Filter {
    ...
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
    private Date startDate;
    }
    
    Class YourObject {
    ...
    
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
    private Date DateAdded;
    }
    

    패턴과 시간대는 지역에 맞게 조정해야합니다.

  8. ==============================

    8.다음과 같이 시도해보십시오.

    다음과 같이 시도해보십시오.

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date fromDate = df.parse(startDate);
    Date toDate = df.parse(endDate);
    Criteria criteria = sessionfactory.getCurrentSession().createCriteria(Customer.class)
       .add(Restrictions.between("dateAdded", fromDate , toDate ));
    List<Customer> listCustomer = criteria.list();
    

    희망이 도움이 .. .. !!

  9. from https://stackoverflow.com/questions/21265134/hql-to-query-records-between-two-dates by cc-by-sa and MIT license