आपको "दो तिथियों के बीच" . को परिभाषित करने की आवश्यकता है अधिक क़रीबी। लोअर और अपर बाउंड शामिल या बहिष्कृत? एक सामान्य परिभाषा होगी शामिल निचला और बहिष्कृत करें एक अंतराल की ऊपरी सीमा। साथ ही, परिणाम को 0 के रूप में परिभाषित करें जब निचली और ऊपरी सीमा समान हो। यह परिभाषा दिनांक घटाव के साथ मेल खाती है बिल्कुल ।
SELECT date '2017-01-31' - date '2017-01-01' AS days_between
रविवार को छोड़कर यह सटीक परिभाषा महत्वपूर्ण है। दी गई परिभाषा के लिए सूर्य-सूर्य (1 सप्ताह बाद) के अंतराल में ऊपरी सीमा शामिल नहीं है, इसलिए केवल 1 है रविवार को घटाना है।
interval in days | sundays
0 | 0
1-6 | 0 or 1
7 | 1
8-13 | 1 or 2
14 | 2
...
7 दिनों के अंतराल में हमेशा ठीक एक रविवार शामिल होता है।
हम एक सादे पूर्णांक विभाजन के साथ न्यूनतम परिणाम प्राप्त कर सकते हैं (दिन / 7 ), जो परिणाम को छोटा कर देता है।
शेष 1-6 दिनों के लिए अतिरिक्त रविवार अंतराल के पहले दिन पर निर्भर करता है। अगर यह रविवार है, तो बिंगो; अगर यह सोमवार है, तो बहुत बुरा है। आदि। हम इससे एक सरल सूत्र प्राप्त कर सकते हैं:
SELECT days, sundays, days - sundays AS days_without_sundays
FROM (
SELECT z - a AS days
, ((z - a) + EXTRACT(isodow FROM a)::int - 1 ) / 7 AS sundays
FROM (SELECT date '2017-01-02' AS a -- your interval here
, date '2017-01-30' AS z) tbl
) sub;
किसी भी . के लिए काम करता है दिया गया अंतराल।
नोट:isodow
, नहीं dow
EXTRACT()
. के लिए ।
शामिल करने के लिए ऊपरी सीमा, बस z - a
. को बदलें (z - a) + 1
. के साथ . (संचालक प्राथमिकता के कारण, कोष्ठक के बिना काम करेगा, लेकिन बेहतर होगा कि स्पष्ट हो।)
प्रदर्शन विशेषता O(1) . है (स्थिर) O(N) . के साथ जेनरेट किए गए सेट पर सशर्त समुच्चय के विपरीत ।
संबंधित:
- मैं PostgreSQL का उपयोग करके पिछले महीने का अंतिम दिन कैसे निर्धारित करूं?
- PostgreSQL में 2 तिथियों के बीच काम के घंटों की गणना करें