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

समय क्षेत्र और समय क्षेत्र के नाम के बिना समय क्षेत्र के साथ समय प्राप्त करें

चेतावनी:PostgreSQL नौसिखिया (प्रश्न पर टिप्पणियाँ देखें!)। हालांकि मुझे समय क्षेत्रों के बारे में कुछ पता है, इसलिए मुझे पता है कि समझ में . क्या है पूछने के लिए।

मुझे ऐसा लगता है कि यह मूल रूप से एक असमर्थित स्थिति है (दुर्भाग्य से) जब यह AT TIME ZONE की बात आती है। . AT TIME ZONE दस्तावेज़ीकरण यह एक तालिका देता है जहाँ "इनपुट" मान प्रकार केवल होते हैं:

  • समय क्षेत्र के बिना टाइमस्टैम्प
  • समय क्षेत्र के साथ टाइमस्टैम्प
  • समय क्षेत्र के साथ समय

हमें वह नहीं मिल रहा है जो आप चाहते हैं:समय बिना समय क्षेत्र। आप जो पूछ रहे हैं वह कुछ हद तक है तार्किक, हालांकि यह तारीख पर निर्भर करता है ... क्योंकि अलग-अलग समय क्षेत्रों में तारीख के आधार पर अलग-अलग ऑफसेट हो सकते हैं। उदाहरण के लिए, 12:00:00 यूरोप/लंदन मई मतलब 12:00:00 UTC, या इसका मतलब 11:00:00 UTC हो सकता है, यह इस बात पर निर्भर करता है कि यह सर्दी है या गर्मी।

मेरे सिस्टम पर, सिस्टम टाइम ज़ोन को अमेरिका/रेजिना में सेट करने के बाद, क्वेरी

SELECT ('2011-11-22T12:00:00'::TIMESTAMP WITHOUT TIME ZONE) 
                               AT TIME ZONE 'America/Vancouver'

मुझे देता है 2011-11-22 14:00:00-06 नतीजतन। यह आदर्श नहीं है , लेकिन यह कम से कम तत्काल समय देता है (मुझे लगता है)। मेरा मानना ​​है कि यदि आप इसे क्लाइंट लाइब्रेरी से प्राप्त करते हैं - या इसकी तुलना किसी अन्य TIMESTAMP WITH TIME ZONE से करते हैं - आपको सही परिणाम मिलेगा। यह केवल टेक्स्ट रूपांतरण है जो तब सिस्टम . का उपयोग करता है आउटपुट के लिए समय क्षेत्र।

क्या यह आपके लिए काफी अच्छा होगा? क्या आप या तो अपना SCHEDULES.time बदल सकते हैं फ़ील्ड एक TIMESTAMP WITHOUT TIME ZONE होने के लिए फ़ील्ड, या (क्वेरी समय पर) समय क्षेत्र के बिना टाइमस्टैम्प बनाने के लिए फ़ील्ड से समय को दिनांक के साथ संयोजित करें?

संपादित करें:यदि आप "वर्तमान तिथि" से खुश हैं तो यह दिखता है जैसे आप बस अपनी क्वेरी को इसमें बदल सकते हैं:

SELECT (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

बेशक, मौजूदा सिस्टम दिनांक स्थानीय समय क्षेत्र में वर्तमान दिनांक के समान नहीं हो सकता है . मैं सोचता हूं यह उस हिस्से को ठीक कर देगा...

SELECT ((current_timestamp AT TIME ZONE USERS.tz)::DATE + schedules.time)
       AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

दूसरे शब्दों में:

  • वर्तमान तत्काल लें
  • उपयोगकर्ता के समय क्षेत्र में स्थानीय तिथि/समय निर्धारित करें
  • उसकी तारीख लें
  • समय क्षेत्र के बिना TIMESTAMP WITHOUT TIME ZONE प्राप्त करने के लिए उस तिथि में समय सारिणी जोड़ें
  • AT TIME ZONE का उपयोग करें उस स्थानीय तिथि/समय पर समय क्षेत्र लागू करने के लिए

मुझे यकीन है कि एक बेहतर तरीका है, लेकिन मैं सोचता हूं यह समझ में आता है।

आपको पता होना चाहिए कि कुछ मामलों में यह विफल हो सकता है, हालांकि:

  • आप क्या चाहते हैं कि जिस दिन घड़ी 01:00 बजे से 02:00 बजे तक चलती है, उस दिन 01:30 के समय का परिणाम क्या हो, ताकि 01:30 बिल्कुल न आए?
  • आप क्या चाहते हैं कि जिस दिन घड़ी 02:00 बजे से 01:00 बजे तक वापस जाती है, उस दिन 01:30 के समय का परिणाम हो, इसलिए 01:30 दो बार आता है?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में बाइटा को डबल प्रिसिजन में बदलें

  2. Postgresql बैकएंड के साथ Heroku पर एक रेल ऐप में COPY FROM का उपयोग करना

  3. PostgreSql डेटाबेस के मालिक को कैसे बदलें?

  4. क्या अस्थायी फ़ंक्शन जैसी कोई चीज़ है?

  5. PostgreSQL अक्षांश देशांतर क्वेरी