केवल सेमेस्टर की लंबाई या उनके बीच के अंतराल को देखने के बजाय, आप generate_series()
, इस तरह:
SELECT
row_number() OVER () as day_number,
day
FROM
(
SELECT
generate_series(start_date, end_date, '1 day') as day
FROM
semesters
) as day_series
ORDER BY
day
यह प्रत्येक सेमेस्टर के दौरान एक मनमाना लेकिन अनुक्रमिक "दिन संख्या" प्रदान करता है, सेमेस्टर के बीच सभी अंतराल को छोड़ देता है।
फिर आप इसे उप-क्वेरी/CTE JOIN
अपने छात्रों की तालिका में संपादित करें:पहले उनकी प्रारंभ तिथि का "दिन संख्या" ढूंढें, फिर 7 * n_weeks
जोड़ें उनकी समाप्ति तिथि का "दिन संख्या" खोजने के लिए, और अंत में उस "दिन संख्या" की वास्तविक तिथि खोजने के लिए वापस शामिल हों।
यह मानता है कि आंशिक सप्ताहों के लिए किसी विशेष प्रबंधन की आवश्यकता नहीं है - अर्थात यदि n_weeks
4 है, छात्र को 28 दिनों के लिए नामांकित किया जाना चाहिए जो एक सेमेस्टर की अवधि के भीतर हैं। दृष्टिकोण को सप्ताहों को मापने के लिए अनुकूलित किया जा सकता है (पास 1 week
generate_series()
. के अंतिम तर्क के रूप में ), यह पता लगाने के अतिरिक्त चरण के साथ कि छात्र का start_date
. किस सप्ताह है में पड़ता है।
यहां एक पूरी क्वेरी है (SQLFiddle डेमो यहां ):
WITH semester_days AS
(
SELECT
semester_id,
row_number() OVER () as day_number,
day_date::date
FROM
(
SELECT
id as semester_id,
generate_series(start_date, end_date, '1 day') as day_date
FROM
semesters
) as day_series
ORDER BY
day_date
)
SELECT
S.id as student_id,
S.start_date,
SD_start.semester_id as start_semester_id,
S.n_weeks,
SD_end.day_date as end_date,
SD_end.semester_id as end_semester_id
FROM
students as S
JOIN
semester_days as SD_start
On SD_start.day_date = S.start_date
JOIN
semester_days as SD_end
On SD_end.day_number = SD_start.day_number + (7 * S.n_weeks)
ORDER BY
S.start_date