ऐसा लगता है कि आप एक स्थानीय समय संग्रहित करना चाहते हैं एक निश्चित समय क्षेत्र के संबंध में। उस स्थिति में, एक 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 |
+---------------------+