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

PostgreSQL:डेटाटाइम के बीच

आपको उम्मीद थी 1-01-01 ... 1-12-31 ... लेकिन PostgreSQL को यह कैसे पता होना चाहिए कि इससे आपका क्या मतलब है?

इनपुट स्ट्रिंग अक्षर की व्याख्या आपके वर्तमान सत्र की सेटिंग के अनुसार की जाती है (जो postgressql.conf में सामान्य सेटिंग्स के लिए डिफ़ॉल्ट है जब तक खारिज नहीं किया जाता)। विशेष रूप से datestyle :

<ब्लॉकक्वॉट>

DateStyle (string )

दिनांक और समय मानों के साथ-साथ अस्पष्ट दिनांक इनपुट मानों की व्याख्या करने के नियमों के लिए प्रदर्शन प्रारूप सेट करता है। ऐतिहासिक कारणों से, इस चर में दो स्वतंत्र घटक होते हैं:आउटपुट स्वरूप विशिष्टता (ISO , Postgres , SQL , या German ) और वर्ष/माह/दिन ऑर्डरिंग के लिए इनपुट/आउटपुट विनिर्देश (DMY , MDY , या YMD ) इन्हें अलग या एक साथ सेट किया जा सकता है। कीवर्डEuro और European DMY . के पर्यायवाची हैं; कीवर्ड US ,NonEuro , और NonEuropean MDY . के पर्यायवाची हैं . देखें अनुभाग8.5 अधिक जानकारी के लिए। अंतर्निहित डिफ़ॉल्ट ISO, MDY . है , लेकिन initdb कॉन्फ़िगरेशन फ़ाइल को एक सेटिंग के साथ प्रारंभ करेगा जो चुने हुए lc_time के व्यवहार से मेल खाती है लोकेल।

(जबकि आउटपुट स्वरूप ज्यादातर lc_time . द्वारा निर्धारित किया जाता है ।)

आपके मामले में, विकृत टाइमस्टैम्प शाब्दिक 1-12-31 23:59:59 स्पष्ट रूप से इस प्रकार व्याख्या की जाती है:

D-MM-YY h24:mi:ss

जबकि आपने इसकी उम्मीद की होगी:

Y-MM-DD h24:mi:ss

3 विकल्प

  1. datestyle सेट करें ताकि यह शाब्दिक अर्थों की उसी तरह व्याख्या करे जैसे आप करते हैं। शायद ISO, YMD ?

  2. to_timestamp() का उपयोग करें स्ट्रिंग अक्षर को एक अच्छी तरह से परिभाषित तरीके से व्याख्या करने के लिए - अन्य सेटिंग्स से स्वतंत्र। बहुत बेहतर।

     SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
    
  3. बेहतर अभी तक, ISO 8601 प्रारूप का उपयोग करें (YYYY-MM-DD ) सभी डेटाटाइम अक्षर के लिए। यह स्पष्ट और किसी भी सेटिंग से स्वतंत्र . है ।

     SELECT '2001-12-31 23:59:59'::timestamp;
    

क्वेरी फिर से लिखें

आपकी क्वेरी शुरू में दोषपूर्ण है। श्रेणी प्रश्नों को अलग तरीके से संभालें। पसंद:

SELECT d.given_on 
FROM   documents_document d
WHERE  EXTRACT('month' FROM d.given_on) = 1
AND    d.given_on >= '2001-01-01 0:0'
AND    d.given_on <  '2002-01-01 0:0'
ORDER  BY d.created_on DESC;

या, अभी तक आसान:

SELECT d.given_on 
FROM   documents_document d
WHERE  d.given_on >= '2001-01-01 0:0'
AND    d.given_on <  '2001-02-01 0:0'
ORDER  BY d.created_on DESC;

PostgreSQL 9.2 या नए में रेंज प्रकार रुचि के हो सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA में अपवाद PostgreSQL के लिए बीज फ़ाइल का उपयोग करते समय

  2. PostgreSQL अंतराल मान '2 दिन' को कैसे सम्मिलित करें

  3. पोस्टग्रेज में अधिकतम कनेक्शन कैसे बढ़ाएं?

  4. PostgreSQL में date_trunc 5 मिनट का अंतराल

  5. किसी फ़ील्ड में PostgreSQL अनुक्रम बनाना (जो रिकॉर्ड की आईडी नहीं है)