2010-03-30 15 views
6

में टाइमस्टैम्प कॉलम पर हाइबरनेट के साथ दिनांक क्वेरी एक तालिका में टाइमस्टैम्प कॉलम है। उसमें एक नमूना मूल्य 2010-03-30 13:42:42 हो सकता है। हाइबरनेट के साथ, मैं एक रेंज क्वेरी प्रतिबंध कर रहा हूं। बीच ("कॉलम-नाम" ,डेट से, डेटडेटा)।PostgreSQL

इस कॉलम के लिए हाइबरनेट मैपिंग निम्नानुसार है।

<property name="orderTimestamp" column="order_timestamp" type="java.util.Date" /> 

मान लें, मैं सभी रिकॉर्ड है कि तारीख 30 मार्च 2010 और 31 मार्च, 2010 इस क्षेत्र पर एक सीमा क्वेरी इस प्रकार से किया जाता है पता लगाना चाहते हैं।

Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30"); 
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31"); 
Expression.between("orderTimestamp", fromDate, toDate); 

यह काम नहीं करता।

क्वेरी को संबंधित टाइमस्टैम्प में "2010-03-30 00:00:00" और "2010-03-31 00:00:00" के रूप में परिवर्तित किया गया है। इसलिए, 31 मार्च 2010 के लिए सभी रिकॉर्ड अनदेखा कर दिए गए हैं।

इस समस्या का एक आसान समाधान "2010-03-31 23:59:59" के रूप में समाप्ति तिथि हो सकता है। लेकिन, मैं जानना चाहता हूं कि टाइमस्टैम्प कॉलम के केवल दिनांक भाग से मेल खाने का तरीका है या नहीं।

इसके अलावा, दोनों सीमाओं सहित Expression.between() है? दस्तावेज़ीकरण इस पर कोई प्रकाश नहीं फेंकता है।

+0

मेरा मानना ​​है कि दोनों सीमाओं पर हमेशा अनन्य है। आप केवल 1 मिलीसेकंड क्यों नहीं हटाते हैं और उनमें से प्रत्येक को 1 मिलीसेकंड जोड़ते हैं? – jishi

+3

@ jishi यह डेटाबेस निर्भर है (और अधिकांश समय समावेशी मुझे विश्वास है)। –

+0

शशिकांत क्या आप इसे हल करने में सक्षम हो सकते हैं? – changeme

उत्तर

0

शायद आप DATE को CAST ऑर्डर टिमस्टैम्प कर सकते हैं। इसके लिए एचक्यूएल does have support

1

"2010-03-31 23:59:59।" सीमा की स्थिति संभावित रूप से खतरनाक है: यदि 23:59:59 और 00:00:00 के बीच सिस्टम में कोई लेनदेन हुआ था, तो आप इसे याद करेंगे। यदि आपके पास दैनिक और लंबी अवधि के लिए पर्याप्त लेन-देन हैं, तो एक रिपोर्ट तोड़ने जा रही है और आप यह जानने के लिए घंटों खर्च करेंगे।

पोस्टग्रेएसक्यूएल betweenincludes the limits इसलिए यह अंतिम तिथि 2010-04-01 00:00:00 को सेट करने के लिए भी सुरक्षित नहीं होगा। सुनिश्चित करने के लिए lt() और gt() का प्रयोग करें।

+0

अभी भी उड़ नहीं जाएगा, जिसमें 2010-04-01 00:00 पूर्वाह्न –

+0

शामिल होगा जिसमें लेफ्टिनेंट ("एंडडेट", एंडडेट) का उपयोग किया जाएगा, जहां एंडडेट = "2010-04-01 00:00" में अंत दिनांक 2010 के साथ रिकॉर्ड शामिल होंगे -04-01 00:00? मुझे नहीं लगता कि यह मामला है। –

+0

PostgreSQL के लिए समावेशी 'बीच' के लिए लिंक के लिए धन्यवाद। सीमा की स्थिति चिंता का अधिक नहीं है क्योंकि टाइमस्टैम्प केवल सेकंड की परिशुद्धता में दर्ज की जाती हैं। उपयोग करने के लिए, उससे कम या उससे अधिक, मुझे कम से कम ("2010-04-01 00:00:00") और अधिक से अधिक या बराबर ("2010-03-30 00" : 00: 00 ") –

3

, मैं जानना चाहता हूं कि टाइमस्टैम्प कॉलम के केवल दिनांक भाग से मिलान करने का कोई तरीका है या नहीं।

आप एक टाइमस्टैम्प नहीं करना चाहते हैं, किसी दिनांक का उपयोग (और आप type="date" उपयोग नहीं करना चाहिए?)।

इसके अलावा, Expression.between() दोनों सीमाओं सहित?

ऐसा लगता है कि SQL BETWEEN ऑपरेटर का व्यवहार database dependent है। PosgresQL, के बीच अभिव्यक्ति के साथ:

y <= x AND x <= z 

अर्थात समावेशी:

x BETWEEN y AND z 

शब्दार्थ के बराबर है।

+0

प्रकार =" तिथि "मदद नहीं करता है। एनोटेशन के अपने पहले के विचार को आजमाएं, लेकिन दुर्भाग्य से, मैं 3.3 से अधिक पुराने हाइबरनेट संस्करण पर हूं जिसमें एनोटेशन पेश किए गए थे। –

+0

@Shashikant मैंने अपना जवाब थोड़ा तेज़ पोस्ट किया, आपको एहसास नहीं हुआ कि आप एक्सएमएल मैपिंग्स (इसलिए अपडेट) का उपयोग कर रहे थे। लेकिन वास्तव में, हाइबरनेट एनोटेशन के लिए @Temporal एनोटेशन (http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e342) है। एक्सएमएल के साथ कुछ प्रकार के बराबर होना चाहिए ... क्या आपके पास अपने भौतिक मॉडल बीटीडब्ल्यू पर नियंत्रण है? –

+0

डीबी स्कीमा (यानी टाइमस्टैम्प कॉलम) और हाइबरनेट संस्करण को छोड़कर, मैं और कुछ भी बदल सकता हूं। अस्थायी एनोटेशन उपयोगी लगता है लेकिन जैसा कि मैंने उल्लेख किया है, मैं हाइबरनेट 3.3+ पर नहीं जा सकता। इसके अलावा, यदि मैं पंक्ति को पुनर्प्राप्त करते समय तिथि के रूप में टेम्पोरल एनोएशन जोड़ता हूं, तो क्या यह आज तक टाइमस्टैम्प को छोटा कर देगा? यदि हाँ, यह अवांछनीय है। मदद के लिए धन्यवाद, पास्कल। +1 संशोधित करना –

0

कास्ट (your_data, दिनांक) का उपयोग करें, याद रखें कि कास्ट फ़ंक्शन का दूसरा तर्क कम होना चाहिए, या यह काम नहीं करेगा।

एट .: सैमुअल \ Maycon