समस्या:
आप PostgreSQL डेटाबेस में दो दिनांक/डेटाटाइम मानों के बीच अंतर खोजना चाहेंगे।
उदाहरण:
हमारे डेटाबेस में employment कॉलम में डेटा के साथ id , first_name , last_name , start_date , और end_date :
| आईडी | <थ>प्रथम_नामlast_name | <थ>प्रारंभ_दिनांक <थ>समाप्ति_तिथि|||
|---|---|---|---|---|
| 1 | बारबरा | विल्सन | 2010-02-01 | 2018-10-30 |
| 2 | रॉबर्ट | एंडरसन | 2001-04-17 | 2011-12-20 |
| 3 | स्टीवन | नेल्सन | 2005-06-01 | 2019-09-23 |
प्रत्येक कर्मचारी के लिए, आइए उनका पहला और अंतिम नाम और उनके रोजगार की शुरुआत और समाप्ति तिथियों के बीच का अंतर प्राप्त करें। हम वर्षों, महीनों और दिनों में अंतराल देखना चाहते हैं।
समाधान 1:
हम AGE() . का इस्तेमाल करेंगे समारोह। यहां वह प्रश्न है जो आप लिखेंगे:
SELECT first_name,
last_name,
AGE(end_date, start_date)
AS employment_interval
FROM employment;
ये रहा क्वेरी का नतीजा:
| last_name | रोज़गार_अंतराल | |
|---|---|---|
| बारबरा | विल्सन | 8 साल 8 महीने 29 दिन |
| रॉबर्ट | एंडरसन | 10 साल 8 महीने 3 दिन |
| स्टीवन | नेल्सन | 14 साल 3 महीने 22 दिन |
चर्चा:
PostgreSQL AGE() का उपयोग करें दो टाइमस्टैम्प या तिथियों के बीच के अंतराल को पुनः प्राप्त करने के लिए कार्य करता है। यह फ़ंक्शन दो तर्क लेता है:पहला अंतिम दिनांक है और दूसरा प्रारंभ दिनांक है। हमारे उदाहरण में, हम end_date . कॉलम का उपयोग करते हैं (अर्थात जब कर्मचारी ने वह काम करना बंद कर दिया) और कॉलम start_date (जब कर्मचारी ने वह काम शुरू किया)।
तिथियों के बीच का अंतर वर्षों, महीनों, दिनों, घंटों आदि में अंतराल के रूप में दिया जाता है। स्टीवन नेल्सन के लिए क्वेरी रोजगार की अवधि को अंतराल के रूप में लौटाया '14 years 3 months 22 days '; यह 2005-06-01 के बीच का अंतर है, जब उन्होंने यह काम शुरू किया और 2019-09-23, जब उन्होंने इसे रोका।
AGE() फ़ंक्शन वर्तमान टाइमस्टैम्प/दिनांक और पहले तर्क के बीच अंतर भी प्रदर्शित कर सकता है। इस मामले में, फ़ंक्शन का केवल एक तर्क है:
SELECT first_name,
last_name,
AGE(end_date)
AS employment_interval
FROM employment;
उपरोक्त क्वेरी वर्तमान टाइमस्टैम्प (इस पाठ के लिए, यह '2019-09-26' है) और प्रत्येक कर्मचारी की समाप्ति तिथि (स्तंभ end_date के बीच के अंतराल को प्रदर्शित करती है। )।
| last_name | रोज़गार_अंतराल | |
|---|---|---|
| बारबरा | विल्सन | 10 महीने 27 दिन |
| रॉबर्ट | एंडरसन | 7 साल 9 महीने 6 दिन |
| स्टीवन | नेल्सन | 3 दिन |
स्टीवन के काम पर आखिरी दिन और वर्तमान टाइमस्टैम्प के बीच तीन दिन बीत चुके हैं (लेखन के समय, यह 2019-09-26 है)।
समाधान 2:
आप AGE() . की जगह माइनस ऑपरेटर ('-') का भी इस्तेमाल कर सकते हैं दो तिथियों को घटाने के लिए।
यहां वह प्रश्न है जो आप लिखेंगे:
SELECT first_name,
last_name,
end_date::DATE – start_date::DATE
AS employment_interval
FROM employment;
इस परिणाम में, आप केवल दिनों में अंतर देखेंगे (वर्षों, महीनों और दिनों में नहीं):
| last_name | रोज़गार_अंतराल | |
|---|---|---|
| बारबरा | विल्सन | 3193 |
| रॉबर्ट | एंडरसन | 3899 |
| स्टीवन | नेल्सन | 5227 |