2012-01-23 34 views
7

Tôi có dấu thời gian trong cơ sở dữ liệu và trong ứng dụng tôi có ngày. Tôi thích viết tiêu chuẩn ngủ đông theo cách mà ngủ đông có thể kéo tất cả các mục nhập phù hợp với ngày tháng, không phải là một phần thời gian. ví dụ:So sánh phần ngày của ngày chỉ với Dấu thời gian trong Hibernate

trong DB timestamp

2011-12-01 15:14:14

và trong ứng dụng của tôi không có java.util.Date trong đó có theo thời gian mặc định phần.

vấn đề của tôi là khi tôi tìm kiếm thông tin nhập từ cơ sở dữ liệu với mã sau đây tôi nhận được gì

DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class); 
    criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate)); 
    List entries =this.getHibernateTemplate().findByCriteria(criteria); 

cảm ơn trước

Trả lời

12

Nếu bạn đang tìm kiếm một công dụng chung lọc bởi phạm vi ngày (ví dụ từ hôm nay đến ngày mai). tôi sử dụng nó như vậy:

YourService.java

Date fromTimestamp = new Date(); 
Date toTimestamp = new Date(); 
Date fromDate = DateHelper.getDateWithoutTime(fromTimestamp); 
Date toDate = DateHelper.getDateWithoutTime(DateHelper.getTomorrowDate(toTimestamp)); 

YourDAO.java

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, fromDate)); 
criteria.add(Restrictions.le(TIMESTAMP_FIELD, toDate)); 

DateHelper.java

public static Date getDateWithoutTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    return cal.getTime(); 
} 

public static Date getTomorrowDate(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DATE, 1); 
    return cal.getTime(); 
} 

Và dĩ nhiên - luôn luôn có không gian cho tái cấu trúc trong mọi mã.

4

Nhà điều hành như chỉ có thể được sử dụng trên các giá trị String. Nó không có ý nghĩa về một ngày.

Nếu bạn có ngày 2011-12-01 (giả sử yyyy-MM-dd đây), và bạn muốn tất cả các hàng có dấu thời gian của họ trong ngày hôm nay, sau đó bạn đang tìm kiếm cho tất cả các hàng nơi timestamp là >= 2011-12-01< 2011-12-02.

Vì vậy, thêm 1 ngày để cập nhật của bạn (sử dụng một đối tượng Lịch tạm thời), và sử dụng đoạn mã sau:

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate)); 
criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay)); 
+0

nếu tôi chuyển đổi ngày thành chuỗi thì nó hiển thị cho tôi 2011-12-11 02:00:00 'và nếu tôi trừ hoặc thêm một ngày thì truy vấn của tôi sẽ không thu được kết quả hợp lý. bằng cách này tôi sẽ nhận được những mục nằm trước ngày quy định vì phần thời gian. – Rehman

+0

Sử dụng giới hạn ngày thích hợp. Đặt tất cả các trường thời gian (giờ, phút, giây, mili giây) thành 0. Điều đó làm cho giới hạn dưới. Thêm một ngày. Điều đó làm cho giới hạn trên. –

1
if (model.getFromDOE() != null) { 
     criteria.add(Restrictions.ge("createdDate", 
       getFormattedFromDateTime(model.getFromDOE()))); 
    } 

    if (model.getToDOE() != null) { 
     criteria.add(Restrictions.le("createdDate", 
       getFormattedToDateTime(model.getToDOE()))); 
    } 

private Date getFormattedFromDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTime(); 
} 

private Date getFormattedToDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 23); 
    cal.set(Calendar.MINUTE, 59); 
    cal.set(Calendar.SECOND, 59); 
    return cal.getTime(); 
} 
Các vấn đề liên quan