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

PostgreSQL में TIME WITH TIME ZONE को ठीक से हैंडल करें

आपने जोर दिया कि:

तो आप कभी नहीं एक ही पंक्ति के भीतर एक तिथि रेखा को पार करें। मेरा सुझाव है कि आप 1x तारीख को सेव कर लें 3x समय और समय क्षेत्र (पाठ . के रूप में या FK कॉलम):

CREATE TABLE legacy_table (
   event_id      bigint PRIMARY KEY NOT NULL
 , report_date   date NOT NULL
 , start_hour    time
 , end_hour      time
 , expected_hour time
 , tz            text  -- time zone
);

जैसा कि आप पहले ही पा चुके हैं, timetz (समय क्षेत्र के साथ समय ) आम तौर से बचा जाना चाहिए . यह डीएसटी नियमों के साथ ठीक से व्यवहार नहीं कर सकता (d aylight s एविंग टी आईएमई)।

तो मूल रूप से जो आपके पास पहले से था . बस दिनांक घटक को start_hour . से छोड़ दें , वह मृत भाड़ा है। कास्ट करें टाइमस्टैम्प समय . तक तारीख काटने के लिए। जैसे:(टाइमस्टैम्प '2018-03-25 1:00:00')::time

टीजेड AT द्वारा स्वीकृत कोई भी स्ट्रिंग हो सकती है समय क्षेत्र निर्माण, लेकिन अलग-अलग समय क्षेत्रों से मज़बूती से निपटने के लिए, समय क्षेत्र के नामों का विशेष रूप से उपयोग करना सबसे अच्छा है। कोई भी नाम आपको सिस्टम कैटलॉग pg_timezone_names

भंडारण को अनुकूलित करने के लिए, आप एक छोटी लुकअप तालिका में अनुमत समय क्षेत्र के नाम एकत्र कर सकते हैं और tz टेक्स्ट . को प्रतिस्थापित कर सकते हैं tz_id int संदर्भ my_tz_table . के साथ ।

DST के साथ और बिना दो उदाहरण पंक्तियाँ:

INSERT INTO legacy_table VALUES
   (1, '2018-03-25', '1:00', '3:00', '2:00', 'Europe/Vienna')  -- sadly, with DST
 , (2, '2018-03-25', '1:00', '3:00', '2:00', 'Europe/Moscow'); -- Russians got rid of DST

प्रतिनिधित्व उद्देश्यों या गणनाओं के लिए आप निम्न चीज़ें कर सकते हैं:

SELECT (report_date + start_hour)    AT TIME ZONE tz AT TIME ZONE 'UTC' AS start_utc
     , (report_date + end_hour)      AT TIME ZONE tz AT TIME ZONE 'UTC' AS end_utc
     , (report_date + expected_hour) AT TIME ZONE tz AT TIME ZONE 'UTC' AS expected_utc
     -- START_HOUR - END_HOUR
     , (report_date + start_hour) AT TIME ZONE tz
     - (report_date + end_hour)   AT TIME ZONE tz AS start_minus_end
FROM   legacy_table;

आप एक या अधिक दृश्य बना सकते हैं आवश्यकतानुसार स्ट्रिंग्स को आसानी से प्रदर्शित करने के लिए। तालिका आपकी आवश्यकता . जानकारी संग्रहीत करने के लिए है ।

कोष्ठक पर ध्यान दें! वरना ऑपरेटर + AT TIME ZONE . से पहले आबद्ध होगा ऑपरेटर वरीयता के कारण ।

और परिणाम देखें:

db<>fiddle यहां

चूंकि वियना में समय के साथ हेराफेरी की जाती है (जैसे कोई भी जगह जहां मूर्खतापूर्ण डीएसटी नियम लागू होते हैं), आपको "आश्चर्यजनक" परिणाम मिलते हैं।

संबंधित:




  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. PostgreSQL में मॉड () कैसे काम करता है

  3. PostgreSQL JDBC ड्राइवर Heroku DB कनेक्शन के लिए काम नहीं कर रहा है

  4. PostgreSQL बाधा समस्या

  5. PostgreSQL 9.2 - टेक्स्ट जोंस स्ट्रिंग को टाइप करने के लिए बदलें json/hstore