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

SQL डेटाबेस में अपॉइंटमेंट संग्रहीत करना जैसे कि Java.time ढांचे के साथ उपयोग के लिए Postgres

यह नियुक्ति के प्रकार पर निर्भर करता है।

अपॉइंटमेंट दो प्रकार के होते हैं:

  • समय क्षेत्र के नियमों में किसी भी बदलाव को अनदेखा करते हुए, एक क्षण, समयरेखा पर एक विशिष्ट बिंदु।
    उदाहरण:रॉकेट प्रक्षेपण।
  • दिन का एक दिनांक और समय जो समय क्षेत्र के नियमों में परिवर्तन के लिए समायोजित होना चाहिए।
    उदाहरण:चिकित्सा/दंत यात्रा।

पल

उदाहरण के लिए, यदि हम किसी रॉकेट के प्रक्षेपण की बुकिंग कर रहे हैं, तो हमें दिन की तारीख और समय की परवाह नहीं है। हम केवल उस पल की परवाह करते हैं जब (ए) आकाश संरेखित होता है, और (बी) हम अनुकूल मौसम की उम्मीद करते हैं।

यदि बीच के समय में राजनेता हमारे लॉन्च साइट या हमारे कार्यालयों में उपयोग में आने वाले समय क्षेत्र के नियमों को बदलते हैं, तो इसका हमारे लॉन्च अपॉइंटमेंट पर कोई प्रभाव नहीं पड़ता है। अगर हमारी लॉन्च साइट को नियंत्रित करने वाले राजनेता डेलाइट सेविंग टाइम (DST) को अपनाते हैं। , हमारे लॉन्च का क्षण वही रहता है। यदि हमारे कार्यालयों को संचालित करने वाले राजनेता राजनयिक संबंधों के कारण घड़ी को आधा घंटा पहले बदलें एक पड़ोसी देश के साथ, हमारे लॉन्च का क्षण वही रहता है।

ऐसी नियुक्ति के लिए, हाँ, आपका दृष्टिकोण सही होगा। आप अपॉइंटमेंट को UTC में रिकॉर्ड करेंगे। TIMESTAMP WITH TIME ZONE . प्रकार के कॉलम का उपयोग करना . पुनर्प्राप्ति पर, उपयोगकर्ता द्वारा पसंद किए जाने वाले किसी भी समय क्षेत्र में समायोजित करें।

डेटाबेस जैसे Postgres यूटीसी में समायोजित करने के लिए इनपुट के साथ किसी भी समय क्षेत्र की जानकारी का उपयोग करें, और फिर उस समय क्षेत्र की जानकारी का निपटान करें। जब आप Postgres से मान पुनर्प्राप्त करते हैं, तो यह हमेशा UTC में देखे गए समय-समय के साथ एक तिथि का प्रतिनिधित्व करेगा। सावधान रहें, कुछ टूलिंग या मिडलवेयर में डेटाबेस से पुनर्प्राप्ति और आपको प्रोग्रामर को डिलीवरी के बीच कुछ डिफ़ॉल्ट समय क्षेत्र लागू करने की एंटी-फीचर हो सकती है। लेकिन स्पष्ट रहें:Postgres हमेशा TIMESTAMP WITH TIME ZONE प्रकार के मानों को सहेजता और पुनर्प्राप्त करता है UTC में, हमेशा UTC, और offset-from-UTC शून्य घंटे-मिनट-सेकंड।

यहाँ जावा कोड का कुछ उदाहरण दिया गया है।

LocalDate launchDateAsSeenInRome = LocalDate.of( 2021 , 1 , 23 ) ;
LocalTime launchTimeAsSeenInRome = LocalTime.of( 21 , 0 ) ;
ZoneId zoneEuropeRome = ZoneId.of( "Europe/Rome" ) ;
// Assemble those three parts to determine a moment.
ZonedDateTime launchMomentAsSeenInRome = ZonedDateTime.of( launchDateAsSeenInRome , launchTimeAsSeenInRome , zoneEuropeRome ) ;

UTC में उसी क्षण को देखने के लिए, Instant . में कनवर्ट करें . एक Instant वस्तु हमेशा यूटीसी में देखे गए क्षण का प्रतिनिधित्व करती है।

Instant launchInstant = launchMomentAsSeenInRome.toInstant() ;  // Adjust from Rome time zone to UTC.

Z उपरोक्त स्ट्रिंग उदाहरण के अंत में यूटीसी के लिए मानक संकेतन है, और इसका उच्चारण "ज़ुलु" है।

दुर्भाग्य से JDBC 4.2 टीम ने Instant या ZonedDateTime प्रकार। तो आपका JDBC ड्राइवर आपके डेटाबेस में ऐसी वस्तुओं को पढ़ने/लिखने में सक्षम हो भी सकता है और नहीं भी। अगर नहीं, तो बस OffsetDateTime . तीनों प्रकार एक क्षण का प्रतिनिधित्व करते हैं, समयरेखा पर एक विशिष्ट बिंदु। लेकिन OffsetDateTime JDBC के लिए आवश्यक समर्थन है 4.2 उन कारणों से जो मुझसे बच जाते हैं।

OffsetDateTime odtLaunchAsSeenInRome = launchMomentAsSeenInRome.toOffsetDateTime() ;

डेटाबेस में लिखा जा रहा है।

myPreparedStatement.setObject( … , odtLaunchAsSeenInRome ) ;

डेटाबेस से पुनर्प्राप्ति।

OffsetDateTime launchMoment = myResultSet.getObject( … , OffsetDateTime.class ) ;

अपने उपयोगकर्ता द्वारा वांछित न्यूयॉर्क समय क्षेत्र में समायोजित करें।

ZoneId zoneAmericaNewYork = ZoneId.of( "America/New_York" ) ;
ZonedDateTime launchAsSeenInNewYork = launchMoment.atZoneSameInstant( zoneAmericaNewYork ) ;

आप उपरोक्त सभी कोड रन को IdeOne.com पर लाइव देख सकते हैं

वैसे, पिछली घटनाओं को ट्रैक करना भी एक पल के रूप में माना जाता है। रोगी वास्तव में नियुक्ति के लिए कब आया, ग्राहक ने चालान का भुगतान कब किया, नए भाड़े ने अपने दस्तावेजों पर कब हस्ताक्षर किए, सर्वर कब दुर्घटनाग्रस्त हुआ ... इन सभी को यूटीसी में एक पल के रूप में ट्रैक किया जाता है। जैसा कि ऊपर चर्चा की गई है, आमतौर पर यह Instant . होगा , हालांकि ZonedDateTime &OffsetDateTime एक पल का भी प्रतिनिधित्व करते हैं। डेटाबेस के लिए TIMESTAMP WITH TIME ZONE use का उपयोग करें (नहीं WITHOUT )।

दिन का समय

मुझे उम्मीद है कि अधिकांश व्यवसाय-उन्मुख ऐप्स दूसरे प्रकार की नियुक्तियों पर केंद्रित हैं, जहां हम एक विशिष्ट क्षण के बजाय दिन के समय के साथ एक तिथि का लक्ष्य रखते हैं।

यदि उपयोगकर्ता किसी परीक्षण के परिणामों की समीक्षा करने के लिए अपने स्वास्थ्य देखभाल प्रदाता के साथ अपॉइंटमेंट लेता है, तो वे उस तिथि को दिन के किसी विशेष समय के लिए ऐसा करते हैं। यदि इस बीच राजनेता अपने समय क्षेत्र के नियमों को बदलते हैं, घड़ी को एक घंटे या आधे घंटे या किसी अन्य समय के आगे या पीछे घुमाते हैं, तो उस चिकित्सा नियुक्ति की तिथि और समय-दिन वही रहता है। वास्तव में, राजनेताओं द्वारा समय क्षेत्र बदलने के बाद, समय-सीमा पर पहले/बाद के बिंदु पर शिफ्ट होने के बाद, मूल नियुक्ति की समय-सीमा बदल दी जाएगी।

ऐसी नियुक्तियों के लिए, हम नहीं करते हैं यूटीसी में देखे गए दिनांक और समय-समय पर स्टोर करें। हम नहीं करते हैं डेटाबेस कॉलम प्रकार का उपयोग करें TIMESTAMP WITH TIME ZONE

ऐसी नियुक्तियों के लिए, हम समय क्षेत्र की परवाह किए बिना तारीख को समय-समय पर संग्रहीत करते हैं। हम TIMESTAMP WITHOUT TIME ZONE . प्रकार के डेटाबेस कॉलम का उपयोग करते हैं (नोटिस WITHOUT के बजाय WITH ) जावा में मिलान प्रकार है LocalDateTime

LocalDate medicalApptDate = LocalDate.of( 2021 , 1 , 23 ) ;
LocalTime medicalApptTime = LocalTime.of( 21 , 0 ) ;
LocalDateTime medicalApptDateTime = LocalDateTime.of( medicalApptDate , medicalApptTime ) ;

इसे डेटाबेस में लिखें।

myPreparedStatement.setObject( … , medicalApptDateTime ) ;

इस पर स्पष्ट रहें:एक LocalDateTime ऑब्जेक्ट नहीं करता है एक पल का प्रतिनिधित्व करते हैं, नहीं है समयरेखा पर एक विशिष्ट बिंदु। एक LocalDateTime ऑब्जेक्ट संभव . की श्रेणी का प्रतिनिधित्व करता है समयरेखा के लगभग 26-27 घंटे (दुनिया भर में समय क्षेत्र की सीमा) के साथ क्षण। LocalDateTime . को वास्तविक अर्थ देने के लिए , हमें एक इच्छित समय क्षेत्र संबद्ध करना होगा।

उस इच्छित समय क्षेत्र के लिए, ज़ोन पहचानकर्ता को संग्रहीत करने के लिए दूसरे कॉलम का उपयोग करें। उदाहरण के लिए, स्ट्रिंग्स Europe/Rome या America/New_York . देखें ज़ोन नामों की सूची

ZoneId zoneEuropeRome = ZoneId.of( "Europe/Rome" ) ;

इसे डेटाबेस में टेक्स्ट के रूप में लिखें।

myPreparedStatement.setString( … , zoneEuropeRome ) ;

पुनर्प्राप्ति। ज़ोन नाम को टेक्स्ट के रूप में पुनः प्राप्त करें, और एक ZoneId . को इंस्टेंट करें वस्तु।

LocalDateTime medicalApptDateTime = myResultSet.getObject( … , LocalDateTime.class ) ;
ZoneId medicalApptZone = ZoneId.of( myResultSet.getString( … ) ) ;

ZonedDateTime . के रूप में दर्शाए गए क्षण को निर्धारित करने के लिए उन दो टुकड़ों को एक साथ रखें वस्तु। इसे गतिशील रूप से करें जब आपको कैलेंडर शेड्यूल करने की आवश्यकता हो। लेकिन नहीं करें पल स्टोर करें। यदि राजनेता भविष्य में समय क्षेत्र (क्षेत्रों) को फिर से परिभाषित करते हैं, तो एक अलग क्षण की गणना की जानी चाहिए।

ZonedDateTime medicalApptAsSeenInCareProviderZone = ZonedDateTime.of( medicalApptDateTime , medicalApptZone ) ;

उपयोगकर्ता न्यूयॉर्क यूएस की यात्रा कर रहा है। उन्हें यह जानने की आवश्यकता है कि न्यूयॉर्क के अपने अस्थायी स्थान पर दीवार पर लगी घड़ियों के अनुसार मिलान इटली में स्वास्थ्य देखभाल प्रदाता को कब कॉल करना है। इसलिए एक टाइम ज़ोन से दूसरे टाइम ज़ोन में एडजस्ट करें। एक ही पल, दीवार-घड़ी का अलग समय।

ZoneId zoneAmericaNewYork = ZoneId.of( "America/New_York" ) ;
ZonedDateTime medicalApptAsSeenInNewYork = medicalApptAsSeenInCareProviderZone.withZoneSameInstant( zoneAmericaNewYork ) ;

tzdata

ध्यान रखें कि यदि आपके वांछित समय क्षेत्र के नियम बदल रहे हैं, तो आपको अपने कंप्यूटर पर समय क्षेत्र परिभाषाओं की प्रति अपडेट करनी होगी।

Java में tzdata की अपनी प्रति है। , जैसा कि Postgres डेटाबेस इंजन करता है। और आपका होस्ट ऑपरेटिंग सिस्टम भी। यहां दिखाए गए इस विशेष कोड के लिए केवल जावा को अप-टू-डेट होना आवश्यक है। यदि आप समय क्षेत्र समायोजन करने के लिए Postgres का उपयोग करते हैं, तो इसका tzdata अप-टू-डेट भी होना चाहिए। और लॉगिंग और ऐसे के लिए, आपके होस्ट ओएस को अप-टू-डेट रखा जाना चाहिए। उपयोगकर्ता द्वारा उचित घड़ी देखने के लिए, उनके क्लाइंट मशीन का OS भी अप-टू-डेट होना चाहिए।

सावधान रहें:दुनिया भर के राजनेताओं ने अपने समय क्षेत्रों को आश्चर्यजनक आवृत्ति के साथ बदलने के लिए एक रुचि दिखाई है, और अक्सर थोड़ी सी चेतावनी के साथ।

के बारे में java.time

java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं पुराने विरासत की जगह लेती हैं दिनांक-समय की कक्षाएं जैसे java.util.Date , Calendar , और SimpleDateFormat

अधिक जानने के लिए, Oracle Tutorial देखें . और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता है JSR 310

जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , java.time कक्षाएं।

आप java.time . का आदान-प्रदान कर सकते हैं अपने डेटाबेस के साथ सीधे वस्तुओं। JDBC ड्राइवर का उपयोग करें JDBC 4.2 के अनुरूप या बाद में। स्ट्रिंग्स की कोई आवश्यकता नहीं है, java.sql.* . की कोई आवश्यकता नहीं है कक्षाएं। हाइबरनेट 5 और जेपीए 2.2 समर्थन java.time

java.time कक्षाएं कहाँ से प्राप्त करें?



  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. PostGIS में बफ़र्स (सर्कल)

  3. प्रतिकृति अंतराल - max_slot_wal_keep_size से अधिक, WAL खंड नहीं हटाए गए

  4. शब्द को शांत करने का सबसे आसान तरीका पोस्टग्रेएसक्यूएल में अनुक्रमित नोटिस होने के लिए बहुत लंबा है

  5. पोस्टग्रेज में पथ से फ़ाइल का नाम विभाजित करें