PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एसक्यूएल - किसी दिए गए प्रारंभ तिथि से मनमानी विराम के साथ समाप्ति तिथियों की गणना

केवल सेमेस्टर की लंबाई या उनके बीच के अंतराल को देखने के बजाय, आप 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

(SQLFiddle डेमो )

यह प्रत्येक सेमेस्टर के दौरान एक मनमाना लेकिन अनुक्रमिक "दिन संख्या" प्रदान करता है, सेमेस्टर के बीच सभी अंतराल को छोड़ देता है।

फिर आप इसे उप-क्वेरी/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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या COUNT के साथ समान आईडी वाली सभी पंक्तियों को गिनना संभव है?

  2. sqlAlchemy क्वेरी के साथ WTForm SelectField को गतिशील रूप से पॉप्युलेट करें

  3. एक क्वेरी में समग्र विदेशी/प्राथमिक कुंजी के कॉलम पर तालिकाओं में शामिल हों

  4. Jsonb . पर आधारित एक सही EAV संरचना की तलाश है

  5. UTF-8 वर्णों के क्रम को पोस्टग्रेज़ करता है