क्या किसी के पास रविवार से शनिवार तक नंबर बनाने और PostgreSQL (संस्करण 11) में तारीखें बनाने का आसान उपाय है। मेरे पास नीचे का समाधान है लेकिन यह केवल 5 सप्ताह तक सीमित है और मुझे कुछ ऐसा चाहिए जो लचीला हो।

मेरे पास मेरी स्रोत तालिका में एक कॉलम के रूप में तिथियां हैं, मैं चाहता हूं कि उन तिथियों को शनिवार से रविवार तक नीचे की तरह गिना जाए।

वर्तमान क्वेरी

 WITH CTE AS
    (                
    SELECT  1 as rno,generate_series(  date_trunc('week', current_date)::date - 1
    ,   date_trunc('week', current_date)::date + 5
    , interval  '1 day') current_week
    )
    ,CTE_1 AS
    (
    SELECT  rno,current_week FROM CTE   
    UNION
    select 2,dt::date d from generate_series( (SELECT MIN(current_week)::DATE FROM CTE)- interval '7 days', (SELECT MIN(current_week)::DATE FROM CTE)- interval '1 days', interval '1 days') dt
    )
    ,CTE_2 AS
    (
    SELECT  rno,current_week FROM CTE_1
    UNION
    select 3,dt::date d from generate_series( (SELECT MIN(current_week)::DATE FROM CTE_1)- interval '7 days', (SELECT MIN(current_week)::DATE FROM CTE_1)- interval '1 days', interval '1 days') dt
    )
    ,CTE_3 AS
    (
    SELECT  rno,current_week FROM CTE_2
    UNION
    select 4,dt::date d from generate_series( (SELECT MIN(current_week)::DATE FROM CTE_2)- interval '7 days', (SELECT MIN(current_week)::DATE FROM CTE_2)- interval '1 days', interval '1 days') dt
    )
    ,last_5_weeks as
    (
    SELECT  rno,current_week FROM CTE_3
    UNION
    select 5,dt::date d from generate_series( (SELECT MIN(current_week)::DATE FROM CTE_3)- interval '7 days', (SELECT MIN(current_week)::DATE FROM CTE_3)- interval '1 days', interval '1 days') dt
    )
    SELECT rno,current_week::DATE as selected_date FROM last_5_weeks order by selected_date DESC

वर्तमान आउटपुट

 rno  Date
    1   "2020-10-24"
    1   "2020-10-23"
    1   "2020-10-22"
    1   "2020-10-21"
    1   "2020-10-20"
    1   "2020-10-19"
    1   "2020-10-18"
    2   "2020-10-17"
    2   "2020-10-16"
    2   "2020-10-15"
    2   "2020-10-14"
    2   "2020-10-13"
    2   "2020-10-12"
    2   "2020-10-11"
    3   "2020-10-10"
    3   "2020-10-09"
    3   "2020-10-08"
    3   "2020-10-07"
    3   "2020-10-06"
    3   "2020-10-05"
    3   "2020-10-04"
    4   "2020-10-03"
    4   "2020-10-02"
    4   "2020-10-01"
    4   "2020-09-30"
    4   "2020-09-29"
    4   "2020-09-28"
    4   "2020-09-27"
    5   "2020-09-26"
    5   "2020-09-25"
    5   "2020-09-24"
    5   "2020-09-23"
    5   "2020-09-22"
    5   "2020-09-21"
    5   "2020-09-20"
1
Sandeep 22 अक्टूबर 2020, 15:16

2 जवाब

सबसे बढ़िया उत्तर

अंकगणित का उपयोग करने के बारे में कैसे?

select 1 + (row_number() over(order by dt desc) - 1) / 7 rn, dt::date dt
from generate_series(
    date_trunc('week', current_date)::date + 5 - interval '5 week -1 day',
    date_trunc('week', current_date)::date + 5,
    '1 day'
) s(dt)
order by dt desc

generate_series() सभी तिथियों को एक साथ प्रस्तुत करता है। आप शाब्दिक अंतराल में week को दिए गए मान के साथ उत्पन्न होने वाले सप्ताहों की संख्या को नियंत्रित करते हैं। फिर, बाहरी क्वेरी में, हम row_number() का उपयोग सप्ताह की संख्या की गणना करने के लिए करते हैं।

DB Fiddle पर डेमो

1
GMB 22 अक्टूबर 2020, 15:21

एक क्रम हफ्तों के लिए और दूसरा दिनों के लिए। यह लचीला है, 5 एक पैरामीटर है। date_trunc('week',now()+'P1W'::interval)::date-2 इस सप्ताह का शनिवार है।

select 
 w rno,
 date (date_trunc('week',now()+'P1W'::interval)::date-2 + make_interval(weeks => 1-w, days => 1-d)) "Date"
 from generate_series(1, 5, 1) w
 cross join generate_series(1, 7, 1) d;
0
Stefanov.sm 22 अक्टूबर 2020, 16:23