PostgreSQL बग नाम के साथ "एटी टाइम ज़ोन" पर?


12

मैं इस स्टैकओवरफ्लो प्रश्न का उत्तर दे रहा था और अजीब परिणाम मिला:

 select * from  pg_timezone_names where name = 'Europe/Berlin' ;
     name      | abbrev | utc_offset | is_dst 
---------------+--------+------------+--------
 Europe/Berlin | CET    | 01:00:00   | f

और अगली क्वेरी

select id, 
  timestampwithtimezone, 
  timestampwithtimezone at time zone 'Europe/Berlin' as berlin, 
  timestampwithtimezone at time zone 'CET' as cet 
from data ;
 id  | timestampwithtimezone  |       berlin        |         cet         
 -----+------------------------+---------------------+---------------------
 205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
 204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
 203 | 2012-10-28 02:30:00+02 | 2012-10-28 02:30:00 | 2012-10-28 01:30:00
 202 | 2012-10-28 02:59:59+02 | 2012-10-28 02:59:59 | 2012-10-28 01:59:59
 106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00

मैं PostgreSQL 9.1.2 और ubuntu 12.04 का उपयोग कर रहा हूं।
बस जाँच की कि 8.2.11 परिणाम पर एक ही है।

दस्तावेज़ीकरण के अनुसार यह कोई फर्क नहीं पड़ता कि मैं नाम या संक्षिप्त नाम का उपयोग करता हूं।

क्या यह एक बग है?
क्या मुझसे कुछ गलत हो रही है?
क्या कोई इस परिणाम की व्याख्या कर सकता है?

EDIT टिप्पणी के लिए कि CET यूरोप / बर्लिन नहीं है।

मैं अभी pg_timezone_names से मान चुन रहा हूं।

select * from  pg_timezone_names  where abbrev ='CEST';
 name | abbrev | utc_offset | is_dst 
------+--------+------------+--------

तथा

select * from  pg_timezone_names  where abbrev ='CET';
        name         | abbrev | utc_offset | is_dst 
---------------------+--------+------------+--------
 Africa/Tunis        | CET    | 01:00:00   | f
 Africa/Algiers      | CET    | 01:00:00   | f
 Africa/Ceuta        | CET    | 01:00:00   | f
 CET                 | CET    | 01:00:00   | f
 Atlantic/Jan_Mayen  | CET    | 01:00:00   | f
 Arctic/Longyearbyen | CET    | 01:00:00   | f
 Poland              | CET    | 01:00:00   | f
 .....

सर्दियों के दौरान यूरोप / बर्लिन +01 है। गर्मियों के दौरान यह +02 है।

EDIT2 2012-10-28 टाइमज़ोन में गर्मियों के समय से सर्दियों के समय में 2:00 बजे बदल गया है।
यह दो रिकॉर्ड यूरोप / बर्लिन में समान है:

204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
106 | 2012-10-28 02:00:00+01 | 2012-10-28 02:00:00 | 2012-10-28 02:00:00

यह सुझाव देता है कि अगर मैं बड़ी डेटा रेंज (गर्मियों के समय और सर्दियों के समय) के लिए संक्षिप्त (CET या CEST) में से किसी एक का उपयोग करता हूं, तो परिणाम कुछ रिकॉर्ड के लिए गलत होगा। अच्छा होगा यदि मैं 'यूरोप / बर्लिन' का उपयोग करूं।

मैंने सिस्टम का समय बदलकर '2012-01-17' कर दिया है और pg_timezone_names भी बदल गया है।

select * from  pg_timezone_names  where name ='Europe/Berlin';
     name      | abbrev | utc_offset | is_dst 
---------------+--------+------------+--------
 Europe/Berlin | CEST   | 02:00:00   | t

1
यह निश्चित है कि 2012-10-28 01:30:00सीईएसटी है, सीईटी नहीं।
डेज़ो

1
जहाँ तक मुझे पता के रूप में CETहै नहीं Europe/Berlin - कम से कम डीएसटी समय के दौरान नहीं।
a_horse_with_no_name

जवाबों:


9

दरअसल, प्रलेखन स्पष्ट रूप से कहता है कि समय क्षेत्र का नाम और संक्षिप्त नाम अलग-अलग व्यवहार करेगा।

संक्षेप में, यह संक्षिप्त और पूर्ण नामों के बीच का अंतर है: संक्षिप्तीकरण हमेशा UTC से एक निश्चित ऑफ़सेट का प्रतिनिधित्व करते हैं, जबकि अधिकांश पूर्ण नाम स्थानीय डेलाइट-बचत समय नियम को लागू करते हैं, और इसलिए दो संभव UTC ऑफ़सेट हैं। संदर्भ

एफडब्ल्यूआईडब्ल्यू, यही संदर्भ भी कहता है

हम समय क्षेत्र के साथ प्रकार के समय का उपयोग करने की अनुशंसा नहीं करते हैं (हालांकि यह विरासत अनुप्रयोगों के लिए और SQL मानक के अनुपालन के लिए PostgreSQL द्वारा समर्थित है)।


6

और यह अभी भी इसका सार नहीं है! मैं कुछ समय पहले एक समान समस्या में भाग गया था।

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

हम बात कर रहे हैं सीईटी की । वास्तव में मुश्किल बात यह है कि "सीईटी" न केवल (जाहिर है) एक है समय क्षेत्र संक्षिप्त नाम है, यह है भी एक समय क्षेत्र का नाम , कम से कम मेरी स्थापना (PostgreSQL 9.1.6 वातावरण के साथ डेबियन निचोड़ "de_AT.UTF -8 पर के अनुसार ") और अन्य सभी जो मैंने अब तक देखे हैं। मैं इन विवरणों का उल्लेख करता हूं, क्योंकि पोस्टग्रैस उपलब्ध होने पर अंतर्निहित ओएस की स्थानीय जानकारी का उपयोग करता है।

अपने आप को देखो:

SELECT * FROM pg_timezone_names WHERE name = 'CET';

SELECT * FROM pg_timezone_abbrevs WHERE abbrev = 'CET';

एसक्यूएल फिडल।

पोस्टग्रेज ने संक्षिप्त नाम को पूर्ण नाम दिया। इसलिए, भले ही मैंने सीईटी को समय क्षेत्र के नामों में पाया , लेकिन अभिव्यक्ति '2012-01-18 01:00 CET'::timestamptzकी व्याख्या समय क्षेत्र के संक्षिप्तीकरण के लिए अलग-अलग नियमों के अनुसार की गई है ।

अगर वह लोडेड फुटगन नहीं है तो मुझे नहीं पता कि वह क्या है।

अस्पष्टताओं से बचने के लिए, मेरे मामले में समय क्षेत्र नाम 'यूरोप / बर्लिन' (या 'यूरोप / वियना') के साथ जाएं - जो प्रभावी रूप से ऐतिहासिक मतभेदों को छोड़कर, समान है। ऊपर उल्लेखित निकट संबंधी प्रश्न के तहत विषय पर अधिक जानकारी प्राप्त करें ।

समापन में, मैं डीएसटी की नैतिक अवधारणा के लिए अपनी गहराई से अवमानना ​​करना चाहता हूं। इसे अस्तित्व से हटा दिया जाना चाहिए और फिर से कभी नहीं कहा जाना चाहिए।


3

इसे देखो:

select  
    '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'Europe/Berlin' as berlin,
    '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'CET' as cet,
    '2012-10-28 02:30:00+02'::timestamp with time zone at time zone 'CEST' as cest

+02 बर्लिन में CEST है, CET नहीं है।

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