कालांतराने सद्यस्थिती

जेडीबीसीचा शोध लागला आणि त्याचे इंटरफेस प्रमाणित केले गेले तेव्हापासून 20 वर्षे उलटून गेली आहेत आणि या काळात बर्‍याच गोष्टी बदलल्या आहेत.

प्रथम, जग जागतिक झाले आहे आणि आता एक सर्व्हर जगभरातील वापरकर्त्यांना सेवा देऊ शकतो. इंटरनेटचा वेग वाढला आहे. म्हणून, वेळेनुसार कार्य करण्यासाठी SQL मध्ये दुसरा डेटा प्रकार जोडला गेला . आता प्रकार यासारखे दिसतात:

  • DATE - तारीख संग्रहित करते: वर्ष, महिना, दिवस.
  • TIME - वेळ साठवतो: तास, मिनिटे, सेकंद.
  • TIMESTAMP - वेळेत विशिष्ट बिंदू संग्रहित करतो: तारीख, वेळ आणि मिलिसेकंद.
  • टाइम झोन सह टाइमस्टॅम्प - टाइमस्टँप आणि टाइम झोन (झोनचे नाव किंवा ऑफसेट).

दुसरे म्हणजे, जावाने जागतिक वेळ व्यवस्थापनासाठी डेटटाइम API सादर केले. त्याचे खालील वर्ग आहेत:

  • तारीख आणि वेळ :
    • LocalDate
    • स्थानिक वेळ
  • अचूक क्षण :
    • java.time.त्वरित
    • java.time.LocalDateTime
    • java.time.OffsetDateTime
    • java.time.ZonedDateTime
  • टाइम झोन सह वेळ :
    • java.time.OffsetDateTime
    • java.time.ZonedDateTime

तिसरा मनोरंजक मुद्दा असा आहे की अनेक SQL क्लायंट त्यांच्या स्थानिक झोनमध्ये आधीपासूनच सर्व्हरकडून वेळ प्राप्त करू इच्छितात . अर्थात, आपण फ्लायवर वेळ रूपांतरित करू शकता, परंतु ते सोयीचे नाही आणि त्यात चुका आहेत.

उदाहरणार्थ, मला डेटाबेसमधून आजची सर्व कार्ये मिळवायची आहेत. SQL सर्व्हरमध्ये यासाठी CURDATE() फंक्शन आहे. फक्त येथे सर्व्हर यूएसए मध्ये आहे आणि मी जपानमध्ये आहे. आणि माझी इच्छा आहे की त्याने “माझा आजचा” सर्व रेकॉर्ड परत करावा, “त्याचा आजचा” नाही.

सर्वसाधारणपणे, SQL सर्व्हर वेगवेगळ्या टाइम झोनमधील क्लायंटसह स्मार्टपणे काम करण्यास सक्षम असणे आवश्यक आहे.

आधुनिक समस्यांना आधुनिक उपायांची आवश्यकता असते

तत्वतः, Java DateTime API मधील नवीन प्रकार आणि SQL मधील प्रकार सोयीस्करपणे मॅप केले जाऊ शकतात. Java मध्ये DATE प्रकार दर्शवण्यासाठी , तुम्हाला JDK 8 DateTime API मधील java.time.LocalDate वर्ग वापरण्याची आवश्यकता आहे .

डेटाबेसमधील TIME प्रकार Java मधील दोन प्रकारांद्वारे दर्शविला जाऊ शकतो: java.time.LocalTime आणि java.time.OffsetTime . एकतर काहीही क्लिष्ट नाही.

डेटाबेसमधील TIMESTAMP प्रकाराद्वारे दर्शविलेल्या वेळेतील विशिष्ट बिंदू , जावामध्ये 4 प्रकारांद्वारे दर्शविले जाऊ शकते:

  • java.time.त्वरित
  • java.time.LocalDateTime
  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

आणि शेवटी, टाइम झोन सह टाइमस्टॅम्प दोन प्रकारांद्वारे दर्शविले जाऊ शकते:

  • java.time.OffsetDateTime
  • java.time.ZonedDateTime

तुम्ही DateTime API शी आधीच परिचित असल्याने, ही बाब लक्षात ठेवणे तुमच्यासाठी कठीण होणार नाही :)

मी ते टेबलच्या स्वरूपात लिहीन, जेणेकरून ते सोपे होईल:

SQL प्रकार जावा प्रकार
DATE java.time.LocalDate
TIME java.time.LocalTime
java.time.OffsetTime
टाइमस्टॅम्प java.time.Instant
java.time.LocalDateTime
java.time.OffsetDateTime
java.time.ZonedDateTime
टाइम झोन सह टाइमस्टँप java.time.OffsetDateTime
_

तारीख मिळत आहे

माझ्याकडे तुमच्यासाठी एक चांगली बातमी आहे. खूप दिवसांनी पहिले. आपण getDate() पद्धतीची मर्यादा पूर्ण करू शकतो , जी java.sql Date प्रकार परत करते.

मुद्दा असा आहे की वस्तुपरिणाम सेटआणखी एक मनोरंजक पद्धत आहे - getObject() . ही पद्धत दोन पॅरामीटर्स घेते: एक स्तंभ आणि एक प्रकार, आणि दिलेल्या प्रकारात रूपांतरित केलेल्या स्तंभाचे मूल्य परत करते. पद्धतीचे सामान्य स्वरूप खालीलप्रमाणे आहे:

ClassName Name = getObject(column, ClassName);

आणि जर तुम्हाला DATE प्रकार java.time.LocalDate प्रकारात रूपांतरित करायचा असेल , तर तुम्हाला असे काहीतरी लिहावे लागेल:

LocalDate localDate = results.getObject(4, LocalDate.class);

आणि सर्वसाधारणपणे कोणताही TIMESTAMP अनेक प्रकारांमध्ये रूपांतरित केला जाऊ शकतो:

java.time.Instant instant = results.getObject(9, java.time.Instant.class);
java.time.LocalDateTime local = results.getObject(9, java.time. LocalDateTime.class);
java.time.OffsetDateTime offset = results.getObject(9, java.time. OffsetDateTime.class);
java.time.ZonedDateTime zoned = results.getObject(9, java.time. ZonedDateTime.class);

महत्वाचे! तुमच्याकडे जुना MySQL JDBC ड्रायव्हर असल्यास हा कोड काम करणार नाही . तुमच्या pom.xml मध्ये लिहिलेल्या "mysql-connector-java" च्या आवृत्तीकडे लक्ष द्या किंवा प्रोजेक्ट सेटिंग्जमधील लायब्ररीमध्ये जोडले गेले.

तसे, त्याच प्रकारे, आपण आदिम प्रकारांसाठी नल संचयित करण्यास असमर्थता मिळवू शकता. जर टेबल कॉलम INT प्रकारचा असेल, तर त्यातून नल मिळवण्याचे दोन मार्ग आहेत. खालील उदाहरण पहा:

Integer id1 = results.getObject(8, Integer.class);    	 // this will work
Integer id2 = results.getObject(8, int.class);                 //this will also work
int id3 = results.getObject(8,  Integer.class);            	//method will return null, JVM will throw NPE
int id4 = results.getObject(8,  int.class);                    	//method will return null, JVM will throw NPE

MySQL मध्ये टाइमझोन सेटिंग

MySQL सोबतही बर्‍याच मनोरंजक गोष्टी घडल्या. तुम्हाला माहिती आहे की, MySQL कनेक्शन तयार करताना, तुम्ही त्यात विविध पॅरामीटर्स जोडू शकता :
mysql://localhost:3306/db_scheme?Name=meaning&Name=meaning

तर, MySQL मध्ये टाइम झोनसह कार्य करण्यासाठी तीन पॅरामीटर्स जोडले गेले आहेत. जेव्हा तुम्ही सर्व्हरशी कनेक्शन स्थापित करता तेव्हा तुम्ही हे पॅरामीटर्स पास करू शकता.

खाली मी त्यांच्यासोबत एक टेबल देईन:

पॅरामीटर मूल्ये डीफॉल्ट मूल्य
कनेक्शनटाइमझोन स्थानिक | सर्व्हर | वापरकर्ता-झोन सर्व्हर
forceConnectionTimeZoneToSession खरे | खोटे खरे
त्वरित जतन करा खरे | खोटे खोटे

कनेक्शनटाइमझोन पॅरामीटर वापरून , आम्ही टाइम झोन (टाइम झोन) निवडतो ज्यामध्ये सर्व विनंत्या अंमलात आणल्या जातील. क्लायंटच्या दृष्टिकोनातून, सर्व्हर निर्दिष्ट टाइम झोनमध्ये चालू आहे.

forceConnectionTimeZoneToSession पॅरामीटरमुळे सत्र time_zone व्हेरिएबलकडे दुर्लक्ष केले जाते आणि connectTimeZone सह बदलले जाते.

शेवटी, preserveInstants पॅरामीटर JVM च्या टाइमझोन आणि कनेक्शनटाइमझोनमधील अचूक-वेळ-रूपांतर नियंत्रित करते.

सर्वात सामान्य कॉन्फिगरेशन आहेत:

  • connectionTimeZone=LOCAL & force ConnectionTimeZoneToSession=false - useLegacyDatetimeCode=true सह जुन्या MySQL JDBC ड्राइव्हर आवृत्ती 5.1 शी संबंधित आहे.

  • connectionTimeZone=LOCAL & force ConnectionTimeZoneToSession=true हा एक नवीन मोड आहे जो तारीख आणि वेळ मूल्ये हाताळण्याचा सर्वात नैसर्गिक मार्ग प्रदान करतो.

  • connectionTimeZone=SERVER & preserveInstants=true - जुन्या MySQL JDBC ड्रायव्हर आवृत्ती 5.1 ला useLegacyDatetimeCode=false शी संबंधित आहे.

  • connectionTimeZone=user_defined & preserveInstants=true - सर्व्हरचा टाइम झोन कनेक्टरद्वारे ओळखला जाऊ शकत नाही अशा परिस्थितीवर मात करण्यास मदत करते कारण ते CET/CEST सारखे सामान्य संक्षेप म्हणून सेट केले आहे.

होय, तारखा हा एक मनोरंजक विषय आहे आणि त्यांच्यासह अनेक समस्या आहेत. या म्हणीप्रमाणे: हे नक्कीच धडकी भरवणारा आहे, परंतु मला रागही आला नाही! :)