आपको उम्मीद थी 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 विकल्प
-
datestyle
सेट करें ताकि यह शाब्दिक अर्थों की उसी तरह व्याख्या करे जैसे आप करते हैं। शायदISO, YMD
? -
to_timestamp()
का उपयोग करें स्ट्रिंग अक्षर को एक अच्छी तरह से परिभाषित तरीके से व्याख्या करने के लिए - अन्य सेटिंग्स से स्वतंत्र। बहुत बेहतर।SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
-
बेहतर अभी तक, 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 या नए में रेंज प्रकार रुचि के हो सकते हैं।