Sql 编号日期为星期日至星期六

Sql 编号日期为星期日至星期六,sql,postgresql,datetime,window-functions,recursive-query,Sql,Postgresql,Datetime,Window Functions,Recursive Query,是否有人有一个简单的解决方案,从周日到周六进行编号,并在PostgreSQL(版本11)中生成日期。我有下面的解决方案,但它仅限于5周,我需要一些灵活的方法 我的源表中有一列日期,我希望这些日期从周六到周日编号,如下所示 当前查询 WITH CTE AS ( SELECT 1 as rno,generate_series( date_trunc('week', current_date)::date - 1 , date_trun

是否有人有一个简单的解决方案,从周日到周六进行编号,并在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"

使用算术怎么样

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\u number()
枚举周数


一个序列持续数周,另一个序列持续数天。它是灵活的,5是一个参数<代码>日期('week',now()+'P1W'::interval)::date-2是本周的星期六

选择
不,
日期(date_trunc('week',now()+'P1W'::interval)::date-2+make_interval(weeks=>1-w,days=>1-d))“日期”
从生成_系列(1,5,1)w
交叉连接生成_序列(1,7,1)d;