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

PostgreSQL में भविष्य के समय का प्रतिनिधित्व

ऐसा लगता है कि आप एक स्थानीय समय संग्रहित करना चाहते हैं एक निश्चित समय क्षेत्र के संबंध में। उस स्थिति में, एक timestamp store संग्रहित करें (समयक्षेत्र के बिना) और timezone एक अलग कॉलम में।

उदाहरण के लिए, मान लीजिए कि आप शिकागो में 26 फरवरी, 2030 को सुबह 10 बजे होने वाली घटना को रिकॉर्ड करना चाहते हैं और यह सुबह 10 बजे स्थानीय समय होना चाहिए। उस तारीख को प्रभावी समयक्षेत्र नियम की परवाह किए बिना।

यदि डेटाबेस टाइमस्टैम्प को बिना टाइमज़ोन के स्टोर करता है:

unutbu=# select '2030-02-26 10:00:00'::timestamp as localtime, 'America/Chicago' AS tzone;
+---------------------+-----------------+
|      localtime      |      tzone      |
+---------------------+-----------------+
| 2030-02-26 10:00:00 | America/Chicago |
+---------------------+-----------------+

फिर बाद में, आप

. का उपयोग करके ईवेंट का UTC डेटाटाइम पा सकते हैं
unutbu=# select '2030-02-26 10:00:00'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'UTC';
+---------------------+
|      timezone       |
+---------------------+
| 2030-02-26 16:00:00 |
+---------------------+

क्वेरी UTC डेटाटाइम लौटाती है, 2030-02-26 16:00:00 , जो 2030-02-26 10:00:00 . से मेल खाती है शिकागो में स्थानीय समय।

AT TIME ZONE Using का उपयोग करना समय क्षेत्र के नियमों को लागू करने में देरी करता है जब timestamptz . के बजाय क्वेरी की जाती है डाला गया था।

AT TIME ZONE Using का उपयोग करना एक timestamp . पर डेटाटाइम को दिए गए समय क्षेत्र में स्थानीयकृत करता है, लेकिन रिपोर्ट उपयोगकर्ता के समय क्षेत्र में डेटाटाइम .AT TIME ZONE . का उपयोग करना एक timestamptz . पर डेटाटाइम को दिए गए टाइमज़ोन में कनवर्ट करता है, फिर ऑफ़सेट को छोड़ देता है, इस प्रकार एक timestamp लौटाता है .ऊपर, AT TIME ZONE दो बार उपयोग किया जाता है:पहले timestamp को स्थानीयकृत करने के लिए और लौटाए गए timestamptz . को कन्वर्ट करने के लिए अगला एक नए समय क्षेत्र (यूटीसी) के लिए। नतीजा एक timestamp है यूटीसी में।

यहां एक उदाहरण दिया गया है, जो AT TIME ZONE demonstrating को प्रदर्शित करता है timestamp पर का व्यवहार रों:

unutbu=# SET timezone = 'America/Chicago';
unutbu=# SELECT '2030-02-26 10:00:00'::timestamp AT TIME ZONE 'America/Chicago';
+------------------------+
|        timezone        |
+------------------------+
| 2030-02-26 10:00:00-06 |
+------------------------+

unutbu=# SET timezone = 'America/Los_Angeles';
unutbu=# SELECT '2030-02-26 10:00:00'::timestamp AT TIME ZONE 'America/Chicago';
+------------------------+
|        timezone        |
+------------------------+
| 2030-02-26 08:00:00-08 |
+------------------------+

2030-02-26 10:00:00-06 और 2030-02-26 08:00:00-08 एक ही डेटाटाइम हैं लेकिन अलग-अलग उपयोगकर्ता टाइमज़ोन में रिपोर्ट किए गए हैं। यह दिखाता है कि शिकागो में सुबह 10 बजे लॉस एंजिल्स में सुबह 8 बजे है (वर्तमान समय क्षेत्र परिभाषाओं का उपयोग करके):

unutbu=# SELECT '2030-02-26 10:00:00-06'::timestamptz AT TIME ZONE 'America/Los_Angeles';
+---------------------+
|      timezone       |
+---------------------+
| 2030-02-26 08:00:00 |
+---------------------+

AT TIME ZONE using का उपयोग करने का एक विकल्प दो बार उपयोगकर्ता का समय क्षेत्र सेट करना है करने के लिए UTC . तब आप उपयोग कर सकते थे

select localtime AT TIME ZONE tzone

ध्यान दें कि जब इस तरह से किया जाता है, तो एक timestamptz timestamp . के बजाय लौटाया जाता है ।

सावधान रहें कि स्थानीय समय संग्रहीत करना समस्याग्रस्त हो सकता है क्योंकि कोई भी समय और अस्पष्ट समय नहीं हो सकता है। उदाहरण के लिए, 2018-03-11 02:30:00 America/Chicago . में एक गैर-मौजूद स्थानीय समय है . Postgresql यह मानकर गैर-मौजूद स्थानीय समय को सामान्य करता है कि यह डेलाइट सेविंग टाइम (DST) शुरू होने के बाद के समय को संदर्भित करता है (जैसे कि कोई अपनी घड़ी को आगे सेट करना भूल गया हो):

unutbu=# select '2018-03-11 02:30:00'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'UTC';
+---------------------+
|      timezone       |
+---------------------+
| 2018-03-11 08:30:00 |
+---------------------+
(1 row)

unutbu=# select '2018-03-11 03:30:00'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'UTC';
+---------------------+
|      timezone       |
+---------------------+
| 2018-03-11 08:30:00 |
+---------------------+
(1 row)

अस्पष्ट स्थानीय समय का एक उदाहरण है 2018-11-04 01:00:00 America/Chicago में . यह डीएसटी के कारण दो बार होता है। Postgresql DST समाप्त होने के बाद बाद के समय को चुनकर इस अस्पष्टता को हल करता है:

unutbu=# select '2018-11-04 01:00:00'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'UTC';
+---------------------+
|      timezone       |
+---------------------+
| 2018-11-04 07:00:00 |
+---------------------+

ध्यान दें कि इसका मतलब है कि 2018-11-04 06:00:00 UTC को संदर्भित करने का कोई तरीका नहीं है America/Chicago . में स्थानीय समय संग्रहीत करके समयक्षेत्र:

unutbu=# select '2018-11-04 00:59:59'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'UTC';
+---------------------+
|      timezone       |
+---------------------+
| 2018-11-04 05:59:59 |
+---------------------+


  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. यह Django (1.6) एनोटेट गिनती इतनी धीमी क्यों है?

  3. सीरियल प्रकार की विदेशी कुंजी - सुनिश्चित करें कि हमेशा मैन्युअल रूप से पॉप्युलेट किया जाए

  4. अलग-अलग निष्पादन समय को फ़िल्टर करते समय एक ही फ़ील्ड का उपयोग क्यों करते हैं? (विभिन्न सूचकांक उपयोग)

  5. PostgreSQL के साथ उत्पादन में जाने के लिए दस युक्तियाँ