Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जावा इंस्टेंट को MySQL डेटाबेस में कैसे स्टोर करें?

माइक्रोसेकंड में छोटा करें

जाहिर है हम 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 ) ;

कालानुक्रमिक रूप से क्रमबद्ध करते समय, आपको एक बहु-स्तरीय सॉर्ट करना होगा, पहले पूरे सेकंड कॉलम पर सॉर्ट करना होगा और फिर नैनोस फ़्रैक्शन-ऑफ़-सेकंड कॉलम पर सेकेंडरी सॉर्ट करना होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लॉगिन के लिए प्राप्त करें या पोस्ट करें?

  2. nth शब्द कैसे निकालें और MySQL स्ट्रिंग में शब्द घटनाओं की गणना कैसे करें?

  3. क्या तारीखों को MySQL में एक स्ट्रिंग के रूप में स्टोर करना सुरक्षित है?

  4. MySQL उच्चतम मूल्य से DISTINCT का चयन करें

  5. MySQL का MyISAM इंजन विदेशी कुंजियों का समर्थन क्यों नहीं करता है?