PostgreSQL में डिफ़ॉल्ट मूल्य के रूप में UTC में वर्तमान समय का उपयोग करना


172

मेरे पास TIMESTAMP WITHOUT TIME ZONEटाइप का एक कॉलम है और मैं उस समय को UTC में वर्तमान समय के लिए डिफ़ॉल्ट करना चाहूंगा। UTC में वर्तमान समय प्राप्त करना आसान है:

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)

स्तंभ के लिए वर्तमान टाइमस्टैम्प का उपयोग कर रहा है:

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
             ts             
----------------------------
 2013-05-17 14:54:33.072725
(1 row)

लेकिन वह स्थानीय समय का उपयोग करता है। यूटीसी को एक सिंटैक्स त्रुटि के लिए मजबूर करने की कोशिश कर रहा है:

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR:  syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...

जवाबों:


297

एक फ़ंक्शन की भी आवश्यकता नहीं है। डिफ़ॉल्ट अभिव्यक्ति के चारों ओर कोष्ठक लगाएं:

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc')
);

2
मैं एक फ़नटॉन देख सकता हूँ जैसे now_utc () प्रश्न लिखते समय वास्तव में चमकता है
misaxi

यह तब भी काम करता है जब समय एक घंटा पीछे चला जाता है - अब () एक टाइमस्टैम्प लौटाता है जो यूटीसी से ऑफसेट जानता है।
क्ले लेनहार्ट

1
FWIW, PostgreSQL 11.5 में इस क्वेरी को चला रहा है: के ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;साथ विफल रहता है ERROR: column "UTC" does not exist:। सुनिश्चित करें कि 'utc'सभी लोअर-केस है।
code_dredd 1

2
सुधार: 'utc'स्ट्रिंग को भी सिंगल-कोटेड होना चाहिए, न कि डबल-कोटेड।
कोड_ड्रेड



16

व्हाट अबाउट

now()::timestamp

यदि आपके अन्य टाइमस्टैम्प बिना समय क्षेत्र के हैं, तो यह कलाकार मौजूदा समय के लिए मिलान प्रकार "टाइमस्टैम्प विदाउट ज़ोन" का उत्पादन करेगा।

मैं पढ़ना चाहूंगा कि अन्य लोग उस विकल्प के बारे में क्या सोचते हैं, हालांकि। मैं अभी भी इस "समय क्षेत्र सामान के साथ / बिना" मेरी समझ पर भरोसा नहीं करता।

संपादित करें: माइकल एकोका की टिप्पणी को यहाँ जोड़ना क्योंकि यह एक महत्वपूर्ण बिंदु स्पष्ट करता है:

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


यह एक दिलचस्प ट्रिक है लेकिन यह भ्रम पैदा कर सकता है जब तक कि आप इस व्यवहार के बारे में नहीं जानते। स्वीकृत जवाब कार्रवाई और वांछित परिणाम पर स्पष्ट है। फ़ंक्शन के साथ भी लेकिन मैं DBs में फ़ंक्शंस से दूर रहता हूं ....
फ्रैंक वी

मेरे विकल्प में यह स्थानीय
डेटाटाइम

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

@MichaelEkoka मैंने आपकी टिप्पणी उत्तर में जोड़ दी है - कृपया आगे बढ़ें और यदि आप चाहें तो इसे संपादित करें। आप इसे बहुत स्पष्ट रूप से समझा रहे हैं। धन्यवाद!
रिसादिंह

चेतावनी : टाइम ज़ोन फ़ील्ड के साथ टाइमस्टैम्प समय क्षेत्र को संग्रहीत नहीं करता है, जो उचित धारणा के विपरीत है। नीचे दिए गए लिंक को देखें और UTC के लिए पृष्ठ खोजें। इनपुट पर, टाइम ज़ोन वाला टाइमस्टैम्प आने वाले मान को utc में परिवर्तित करता है और उस मान को NO TIME ZONE या OFFSET INFORMATION के साथ संग्रहीत करता है । आउटपुट पर, संग्रहीत utc मान क्लाइंट के समय क्षेत्र का उपयोग करके स्थानीय समय में परिवर्तित किया जाता है यदि उपलब्ध हो। यह प्रकार क्वेरी समय पर मूल्य रूपांतरण के बारे में है। आपको एक समय क्षेत्र से भंडारण करके और एक अलग से चयन करके इसका परीक्षण करना चाहिए। postgresql.org/docs/11/datatype-datetime.html
टॉम

7

ये 2 समान समाधान हैं:

(निम्नलिखित कोड में, आप से प्रतिस्थापित करना चाहिए 'UTC'के लिए क्षेत्र और now()के लिए टाइमस्टैम्प )

  1. timestamp AT TIME ZONE zone एसक्यूएल-मानक-अनुरूप
  2. timezone(zone, timestamp) - यकीनन ज्यादा पठनीय है

फ़ंक्शन टाइमज़ोन (ज़ोन, टाइमस्टैम्प) SQL-कन्फ़र्मिंग टाइमस्टैम्प एटी टाइम ज़ोन ज़ोन के बराबर है।


स्पष्टीकरण:

  • ज़ोन को एक टेक्स्ट स्ट्रिंग (जैसे, 'UTC') या एक अंतराल (जैसे, INTERVAL '-08:00') के रूप में निर्दिष्ट किया जा सकता है - यहां सभी उपलब्ध समय की सूची है
  • टाइमस्टैम्प किसी भी प्रकार के टाइमस्टैम्प हो सकते हैं
  • now()आपके डेटाबेस के डिफ़ॉल्ट टाइम ज़ोन संलग्न (जैसे ) के साथ टाइमस्टैम्प (बस हमें क्या चाहिए) का मान लौटाता है 2018-11-11T12:07:22.3+05:00
  • timezone('UTC', now())हमारे वर्तमान समय ( समय क्षेत्र के साथ प्रकार टाइमस्टैम्प का ) में समय के बराबर समय में बदल जाता है UTC
    जैसे, SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'लौट आएगा 2020-03-16T20:00:00Z

डॉक्स: टाइमज़ोन ()


1
इन बातों को संक्षेप में बताने के लिए धन्यवाद। मैंने लोअरकेस संस्करण का उपयोग किया है at timezone 'utc'और यह मेरे PostgreSQL सेटअप के साथ काम नहीं करता है। अपरकेस अक्षरों के उपयोग से समस्या हल हुई
Geradlus_RU

2

पहले से ही मौजूद है: समयक्षेत्र ('UTC' :: पाठ, अब ())

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.