2012-01-23 13 views
7

में टाइमस्टैम्प के साथ दिनांक की तारीख भाग की तुलना करें मेरे पास डेटाबेस में टाइमस्टैम्प है और एप्लिकेशन में मेरे पास तारीख है। मैं हाइबरनेट मानदंड लिखना पसंद करता हूं कि हाइबरनेट उन सभी मैचों को उन तारीखों से खींच सकता है, समय के साथ नहीं। उदा।हाइबरनेट

डीबी टाइमस्टैम्प

2011-12-01 15:14:14

में और आवेदन में

मैं java.util.Date जो डिफ़ॉल्ट समय भाग से है की क्या ज़रूरत है। जब मैं कोड निम्नलिखित के साथ डेटाबेस से खोज प्रविष्टियों

मेरी समस्या है मैं कुछ भी नहीं अग्रिम

उत्तर

12

आप देख रहे हैं तिथि सीमा से छानने के सामान्य उपयोग के लिए (जैसे आज से कल तक)। मैं इसे इस तरह का उपयोग करें:

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(); 
} 

और निश्चित रूप से - वहाँ हमेशा के लिए जगह नहीं है हर कोड में refactoring।

4

में

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

धन्यवाद की तरह ऑपरेटर केवल स्ट्रिंग मान पर इस्तेमाल किया जा सकता हो। यह किसी तारीख को समझ में नहीं आता है।

आप तारीख है, तो 2011-12-01 (yyyy-MM-dd यहाँ यह सोचते हैं), और आप सभी पंक्तियाँ जो आज में उनका टाइमस्टैम्प करना चाहते हैं, तो आप सभी पंक्तियों जहां टाइमस्टैम्प >= 2011-12-01 और < 2011-12-02 है के लिए खोज रहे हैं।

तो, अपनी तिथि के लिए 1 दिन जोड़ने (एक अस्थायी कैलेंडर वस्तु का उपयोग कर), और निम्नलिखित कोड का उपयोग करें:

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

यदि मैं स्ट्रिंग में तारीख को परिवर्तित करता हूं तो यह मुझे 2011-12-11 02:00:00 दिखाता है 'और यदि मैं एक दिन घटाता या जोड़ता हूं तो मेरी क्वेरी व्यावहारिक परिणाम खींच नहीं लेती है। इस तरह से मैं उन समय प्रविष्टियों को प्राप्त करूंगा जो समय के कारण निर्दिष्ट दिन से पहले झूठ बोलते हैं। – Rehman

+0

उपयुक्त दिनांक सीमा का उपयोग करें। सभी समय फ़ील्ड (घंटे, मिनट, सेकंड, मिलीसेकंड) को 0 पर सेट करें जो कम बाध्य बनाता है। एक दिन जोड़ें यह ऊपरी बाउंड बनाता है। –

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(); 
}