SELECT generate_series(date_trunc('week', date '2013-02-01' + interval '6 days')
, date_trunc('week', date '2013-02-01' + interval '1 month - 1 day')
, interval '1 week')::date AS day
UNION SELECT date '2013-02-01'
ORDER BY 1;
इस संस्करण को उप-चयन की आवश्यकता नहीं है, GREATEST
या GROUP BY
और केवल आवश्यक पंक्तियां उत्पन्न करता है। सरल, तेज। यह UNION
से सस्ता है एक पंक्ति।
-
महीने के पहले दिन . में 6 दिन जोड़ें
date_trunc('week', ...)
. से पहले महीने के पहले सोमवार की गणना करने के लिए । -
date_trunc('week', ...)
. से 1 दिन पहले 1 महीना जोड़ें और घटाएं महीने का अंतिम सोमवार . पाने के लिए .
इसे आसानी से एकinterval
में भरा जा सकता है अभिव्यक्ति:'1 month - 1 day'
-
UNION
(नहींUNION ALL
) इसे जोड़ने के लिए महीने का पहला दिन, जब तक कि इसे पहले से ही सोमवार के रूप में शामिल न किया गया हो। -
ध्यान दें कि
date
+interval
timestamp
में परिणाम , जो यहाँ इष्टतम है। विस्तृत विवरण:
स्वचालन
आप CTE में दिनांक श्रृंखला की शुरुआत प्रदान कर सकते हैं:
WITH t(d) AS (SELECT date '2013-02-01') -- enter 1st of month once
SELECT generate_series(date_trunc('week', d + interval '6 days')
, date_trunc('week', d + interval '1 month - 1 day')
, interval '1 week')::date AS day
FROM t
UNION SELECT d FROM t
ORDER BY 1;
या बार-बार कॉल करने की सुविधा के लिए इसे एक साधारण SQL फ़ंक्शन में लपेटें:
CREATE OR REPLACE FUNCTION f_week_starts_this_month(date)
RETURNS SETOF date AS
$func$
SELECT generate_series(date_trunc('week', $1 + interval '6 days')
, date_trunc('week', $1 + interval '1 month - 1 day')
, interval '1 week')::date AS day
UNION
SELECT $1
ORDER BY 1
$func$ LANGUAGE sql IMMUTABLE;
कॉल करें:
SELECT * FROM f_week_starts_this_month('2013-02-01');
आप महीने के पहले दिन के लिए तारीख पास करेंगे, लेकिन यह किसी भी . के लिए काम करता है दिनांक। आप पहले दिन और अगले महीने के सभी सोमवार।