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

पोस्टग्रेएसक्यूएल गलत टाइमस्टैम्प से टाइम ज़ोन के बिना टाइम ज़ोन के साथ टाइमस्टैम्प में परिवर्तित हो रहा है

समझने योग्य मुख्य बातें

timestamp without time zone AT TIME ZONE फिर से व्याख्या करें एक timestamp उस समय क्षेत्र में होने के नाते उसे UTC में बदलने के उद्देश्य से

timestamp with time zone AT TIME ZONE रूपांतरित एक timestamptz एक timestamp . में निर्दिष्ट समय क्षेत्र पर।

PostgreSQL ISO-8601 टाइमज़ोन का उपयोग करता है, जो निर्दिष्ट करता है कि ग्रीनविच का पूर्व सकारात्मक है ... पागलपन आता है।

पहला परिणाम अप्रत्याशित परिणाम क्यों देता है

SQL में टाइमस्टैम्प और टाइमज़ोन भयानक हैं। यह:

select '2011-12-30 00:30:00'::timestamp without time zone AT TIME ZONE 'EST5EDT';

अज्ञात-टाइप किए गए शाब्दिक '2011-12-30 00:30:00' . की व्याख्या करता है timestamp without time zone . के रूप में , जिसे पीजी मानता है कि स्थानीय टाइमज़ोन में है जब तक कि अन्यथा न कहा जाए। जब आप AT TIME ZONE . का उपयोग करते हैं , यह (कल्पना के अनुसार) फिर से व्याख्या की गई . है timestamp with time zone . के रूप में समय क्षेत्र में EST5EDT फिर यूटीसी में एक पूर्ण समय के रूप में संग्रहीत किया जाता है - इसलिए इसे से . में परिवर्तित किया जाता है EST5EDT से UTC, यानी टाइमज़ोन ऑफ़सेट घटाया . हो जाता है . x - (-5) x + 5 है ।

यह टाइमस्टैम्प, जिसे UTC संग्रहण में समायोजित किया जाता है, फिर आपके सर्वर TimeZone . के लिए समायोजित किया जाता है प्रदर्शन के लिए सेटिंग ताकि यह स्थानीय समय में प्रदर्शित हो।

यदि आप इसके बजाय यह कहना चाहते हैं कि "मेरे पास यूटीसी समय में यह टाइमस्टैम्प है, और यह देखना चाहते हैं कि EST5EDT में समतुल्य स्थानीय समय क्या है", यदि आप सर्वर टाइमज़ोन सेटिंग से स्वतंत्र होना चाहते हैं, तो आपको कुछ इस तरह लिखना होगा:

select TIMESTAMP '2011-12-30 00:30:00' AT TIME ZONE 'UTC'
       AT TIME ZONE 'EST5EDT';

यह कहता है "टाइमस्टैम्प 2011-12-30 00:30:00 को देखते हुए, टाइमस्टैम्प में कनवर्ट करते समय इसे UTC में टाइमस्टैम्प के रूप में मानें, फिर उस टाइमस्टैम्प को EST5EDT में स्थानीय समय में बदलें"।

भयानक, है ना? मैं एक एक फर्म को बात करना चाहता हूं जो कोई भी AT TIME ZONE . के पागल शब्दार्थ पर निर्णय लेता है - यह वास्तव में timestamp CONVERT FROM TIME ZONE '-5' जैसा कुछ होना चाहिए और timestamptz CONVERT TO TIME ZONE '+5' . साथ ही, timestamp with time zone वास्तव में इसके साथ अपना समय क्षेत्र होना चाहिए, यूटीसी में संग्रहीत नहीं किया जाना चाहिए और स्थानीय समय में स्वतः परिवर्तित हो जाना चाहिए।

दूसरा काम क्यों करता है (जब तक TimeZone =UTC)

आपका मूल "काम करता है" संस्करण:

select '2011-12-30 00:30:00' AT TIME ZONE 'EST5EDT';

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

तीसरा क्यों काम करता है

दो समस्याएं एक दूसरे को रद्द कर देती हैं।

काम करने के लिए प्रतीत होने वाला दूसरा संस्करण टाइमज़ोन स्वतंत्र है, लेकिन यह केवल इसलिए काम करता है क्योंकि दो समस्याएं स्वयं को रद्द कर देती हैं। सबसे पहले, जैसा कि ऊपर बताया गया है, timestamp without time zone AT TIME ZONE फिर से व्याख्या करें यूटीसी टाइमस्टैम्प्टज़ में रूपांतरण के लिए उस समय क्षेत्र में होने के रूप में टाइमस्टैम्प; यह प्रभावी रूप से घटाना समय क्षेत्र ऑफसेट।

हालांकि, जिन कारणों से मैं अपने केन से परे हूं, पोस्टग्रेएसक्यूएल टाइमस्टैम्प का उपयोग रिवर्स साइन के साथ करता है जिसका उपयोग मैं ज्यादातर जगहों को देखने के लिए करता हूं। दस्तावेज़ देखें:

<ब्लॉकक्वॉट>

ध्यान में रखने के लिए एक और मुद्दा यह है कि पॉज़िक्स समय क्षेत्र के नामों में, ग्रीनविच के पश्चिम में स्थानों के लिए सकारात्मक ऑफ़सेट का उपयोग किया जाता है। हर जगह, PostgreSQL ISO-8601 कन्वेंशन का पालन करता है कि सकारात्मक टाइमज़ोन ऑफ़सेट ग्रीनविच के पूर्व में हैं।

इसका मतलब है कि EST5EDT +5 . जैसा ही है , नहीं -5 . यही कारण है कि यह काम करता है:क्योंकि आप tz ऑफ़सेट को घटा रहे हैं इसे जोड़ नहीं रहे हैं, लेकिन आप एक नकारात्मक ऑफ़सेट घटा रहे हैं!

इसके बजाय आपको इसे ठीक करने की आवश्यकता होगी:

select TIMESTAMP '2011-12-30 00:30:00' AT TIME ZONE 'UTC'
       AT TIME ZONE '+5';



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL डेटाबेस बनाएँ

  2. postgreSQL - बनाम कोई भी

  3. PostgreSQL में मॉड () कैसे काम करता है

  4. Psycopg2 अजगर पुस्तकालय के साथ SQL गतिशील क्वेरी का निर्माण करें और अच्छे रूपांतरण प्रकार के टूल का उपयोग करें

  5. PostgreSQL में अग्रणी शून्य जोड़ने के 2 तरीके