दिनांक की एक श्रृंखला उत्पन्न करने के लिए यह इष्टतम तरीका है:
SELECT t.day::date
FROM generate_series(timestamp '2004-03-07'
, timestamp '2004-08-16'
, interval '1 day') AS t(day);
अतिरिक्त date_trunc()
की जरूरत नहीं है। कास्ट date
( day::date
) ऐसा करता है।
लेकिन date
इनपुट पैरामीटर के रूप में दिनांक शाब्दिक कास्ट करने का कोई मतलब नहीं है । Au गर्भनिरोधक, timestamp
सबसे अच्छा विकल्प है । प्रदर्शन में लाभ छोटा है, लेकिन इसे नहीं लेने का कोई कारण नहीं है। और आप अनावश्यक रूप से डीएसटी (दिन के समय की बचत समय) के नियमों को शामिल नहीं करते हैं, date
जिससे timestamp with time zone
और पीछे से रूपांतरण हो जाता है । निचे देखो।
समतुल्य, कम स्पष्ट लघु वाक्य विन्यास:
SELECT day::date
FROM generate_series(timestamp '2004-03-07', '2004-08-16', '1 day') day;
या SELECT
सूची में सेट-रिटर्न फ़ंक्शन के साथ :
SELECT generate_series(timestamp '2004-03-07', '2004-08-16', '1 day')::date AS day;
AS
कीवर्ड है आवश्यक पिछले संस्करण में, Postgres स्तंभ उर्फ नादुस्र्स्ती से समझना होगा day
अन्यथा। और मैं यह सलाह नहीं दूंगा कि 10 से पहले वाले वेरिएंट - कम से कम एक ही SELECT
सूची में एक से अधिक सेट-रिटर्निंग फंक्शन के साथ नहीं :
(एक तरफ, अंतिम संस्करण आमतौर पर एक छोटे से मार्जिन से सबसे तेज है।)
क्यों timestamp [without time zone]
?
कई अतिभारित संस्करण हैं generate_series()
। वर्तमान में (11 पोस्ट):
SELECT oid::regprocedure AS function_signature
, prorettype::regtype AS return_type
FROM pg_proc
where proname = 'generate_series';
function_signature | return_type
: ------------------------------------------------- ------------------------------- | : --------------------------
Gener_series (पूर्णांक, पूर्णांक, पूर्णांक) | पूर्णांक
Gener_series (पूर्णांक, पूर्णांक) | पूर्णांक
Gener_series (bigint, bigint, bigint) | bigint
Gener_series (bigint, bigint) | bigint
Gener_series (संख्यात्मक, संख्यात्मक, संख्यात्मक) | संख्यात्मक
Gener_series (संख्यात्मक, संख्यात्मक) | संख्यात्मक
Gener_series (टाइम ज़ोन के बिना टाइमस्टैम्प, टाइम ज़ोन के बिना टाइमस्टैम्प, अंतराल) | टाइम ज़ोन के बिना टाइमस्टैम्प
Gener_series (टाइम ज़ोन के साथ टाइमस्टैम्प, टाइम ज़ोन के साथ टाइमस्टैम्प, अंतराल) | टाइम ज़ोन के साथ टाइमस्टैम्प
( numeric
वेरिएंट को पोस्टग्रेज 9.5 के साथ जोड़ा गया था।) संबंधित व्यक्ति बोल्ड लेने और लौटने timestamp
/ में अंतिम दो हैं timestamptz
।
नहीं है कोई संस्करण लेने या लौटनेdate
। लौटने के लिए एक स्पष्ट कलाकार की आवश्यकता होती है date
। timestamp
तर्कों के साथ कॉल सीधे फ़ंक्शन प्रकार रिज़ॉल्यूशन नियमों में उतरने के बिना और इनपुट के लिए अतिरिक्त कलाकारों के बिना सबसे अच्छे संस्करण को हल करता है।
timestamp '2004-03-07'
पूरी तरह से मान्य है, btw। 00:00
आईएसओ प्रारूप के साथ छोड़े गए समय वाला भाग चूक जाता है ।
फ़ंक्शन प्रकार रिज़ॉल्यूशन के लिए धन्यवाद हम अभी भी पास कर सकते हैं date
। लेकिन यह Postgres से अधिक काम की आवश्यकता है। वहाँ एक है निहित कलाकारों से date
करने timestamp
से एक के रूप में अच्छी तरह से date
करने के लिए timestamptz
। अस्पष्ट होगा, लेकिन timestamptz
है "पसंदीदा" "दिनांक / समय प्रकार" के बीच। इसलिए मैच 4d चरण में तय किया गया है । :
सभी उम्मीदवारों के माध्यम से दौड़ें और उन लोगों को रखें जो सबसे अधिक पदों पर पसंदीदा प्रकार (इनपुट डेटा प्रकार के प्रकार की श्रेणी) को स्वीकार करते हैं जहां टाइप रूपांतरण की आवश्यकता होगी। सभी उम्मीदवार रखें यदि कोई भी पसंदीदा प्रकार स्वीकार नहीं करता है। यदि केवल एक उम्मीदवार रहता है, तो इसका उपयोग करें; अगले कदम के लिए जारी है।
फ़ंक्शन प्रकार रिज़ॉल्यूशन में अतिरिक्त कार्य के अलावा, इसमें एक अतिरिक्त कास्ट जोड़ा जाता है timestamptz
- जो न केवल अधिक लागत जोड़ता है, बल्कि यह डीएसटी के साथ समस्याओं को भी पेश कर सकता है जो दुर्लभ मामलों में अप्रत्याशित परिणाम देता है। (डीएसटी एक नैतिक अवधारणा है, btw, यह पर्याप्त तनाव नहीं कर सकता है।) संबंधित:
मैंने फिडल में डेमो को और अधिक महंगी क्वेरी योजना दिखाते हुए जोड़ा:
db <> फिडल यहां
सम्बंधित: