माइक्रोसेकंड में छोटा करें
जाहिर है हम nanoseconds
को निचोड़ नहीं सकते एक का रिज़ॉल्यूशन Instant
माइक्रोसेकंड
में MySQL डेटा प्रकार DateTime
का समाधान और Timestamp
।
जबकि मैं MySQL का उपयोग नहीं करता, मैं JDBC ड्राइवर
की कल्पना करता हूं Instant
. प्राप्त करते समय नैनोसेकंड को अनदेखा करने के लिए बनाया गया है , मान को माइक्रोसेकंड में छोटा कर रहा है। मेरा सुझाव है कि आप एक प्रयोग करके देखें, और शायद अपने ड्राइवर के स्रोत कोड की जांच करें जो JDBC 4.2 और बाद के संस्करण का अनुपालन करता है।
Instant instant = Instant.now().with( ChronoField.NANO_OF_SECOND , 123_456_789L ) ; //Set the fractional second to a spefic number of nanoseconds.
myPreparedStatement.setObject( … , instant ) ;
…और…
Instant instant2 = myResultSet.getObject( … , Instant.class ) ;
JDBC 4.2 विशिष्टता
OffsetDateTime
. के लिए समर्थन की आवश्यकता है लेकिन अजीब तरह से दो और सामान्य रूप से उपयोग किए जाने वाले प्रकारों की आवश्यकता नहीं है, Instant
और ZonedDateTime
. अगर आपका JDBC ड्राइवर
Instant
का समर्थन नहीं करता , कनवर्ट करें।
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ; // Use `OffsetDateTime` if your JDBC driver does not support `Instant`.
Instant instant2 = odt.toInstant() ; // Convert from `OffsetDateTime` to `Instant`.
फिर तुलना करें।
Boolean result = instant.equals( instant2 ) ;
System.out.println( "instant: " + instant + " equals instant2: = " + instant2 + " is: " + result ) ;
आप बुद्धिमानी से डेटाबेस से निकाले गए मूल्यों के बारे में चिंतित हैं जो मूल मूल्य से मेल नहीं खाते हैं। एक समाधान, यदि आपकी व्यावसायिक समस्या के लिए स्वीकार्य है, तो अपने मूल डेटा में किसी भी नैनोसेकंड को माइक्रोसेकंड में छोटा करना है। मैं आम तौर पर इस दृष्टिकोण की अनुशंसा करता हूं।
java.time कक्षाएं एक truncatedTo
तरीका। एक ChronoUnit
पास करें एनम ऑब्जेक्ट ग्रैन्युलैरिटी निर्दिष्ट करने के लिए। इस मामले में, वह होगा ChronoUnit.MICROS
।
Instant instant = Instant().now().truncatedTo( ChronoUnit.MICROS ) ;
वर्तमान में यह दृष्टिकोण पर्याप्त होना चाहिए क्योंकि आपके डेटा में कोई नैनोसेकंड होने की संभावना नहीं है। जहां तक मैं जानता हूं, मुख्यधारा के कंप्यूटर आज नैनोसेकंड कैप्चर करने में सक्षम हार्डवेयर घड़ियों को स्पोर्ट नहीं करते हैं।
युग से गणना करें
यदि आप किसी भी नैनोसेकंड डेटा को खोने का जोखिम नहीं उठा सकते हैं जो मौजूद हो सकता है, तो एक गणना-से-युग का उपयोग करें।
मैं आमतौर पर एक युग संदर्भ तिथि से गणना के रूप में दिनांक-समय को ट्रैक करने के खिलाफ अनुशंसा करता हूं। लेकिन आपके पास अपने नैनोसेकंड-आधारित मानों को डेटाबेस में संग्रहीत करने के लिए कुछ अन्य विकल्प हैं जैसे कि MySQL और Postgres माइक्रोसेकंड-आधारित मानों तक सीमित हैं।
पूर्णांकों का युग्म संग्रहित करें
1970-01-01T00:00Z जैसे युग के बाद से बहुत बड़ी संख्या में नैनोसेकंड का उपयोग करने के बजाय, मेरा सुझाव है कि Instant
के आंतरिक द्वारा अपनाए गए दृष्टिकोण का पालन करें। कक्षा:जोड़ी . का उपयोग करें संख्याओं का।
कई संपूर्ण स्टोर करें आपके डेटाबेस में एक पूर्णांक के रूप में सेकंड। दूसरे कॉलम में एक पूर्णांक के रूप में भिन्नात्मक सेकंड में नैनोसेकंड की संख्या को संग्रहीत करता है।
आप इन नंबरों को Instant
. से/से आसानी से निकाल/इंजेक्ट कर सकते हैं वस्तु। केवल साधारण 64-बिट long
संख्याएं शामिल हैं; BigDecimal
. की कोई आवश्यकता नहीं है या BigInteger
. मुझे लगता है कि आप दो संख्याओं में से कम से कम एक के लिए 32-बिट पूर्णांक कॉलम का उपयोग करने में सक्षम हो सकते हैं। लेकिन मैं सादगी के लिए और java.time.Instant
के साथ सीधे संगतता के लिए 64-बिट पूर्णांक कॉलम प्रकारों का चयन करूंगा। वर्ग की लंबी जोड़ी।
long seconds = instant.getEpochSecond() ;
long nanos = instant.getNano() ;
…और…
Instant instant = Instant.ofEpochSecond( seconds , nanos ) ;
कालानुक्रमिक रूप से क्रमबद्ध करते समय, आपको एक बहु-स्तरीय सॉर्ट करना होगा, पहले पूरे सेकंड कॉलम पर सॉर्ट करना होगा और फिर नैनोस फ़्रैक्शन-ऑफ़-सेकंड कॉलम पर सेकेंडरी सॉर्ट करना होगा।