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

时间:2020-10-22 12:16:16

标签: sql postgresql datetime window-functions recursive-query

有人能从周日到周六进行编号并在PostgreSQL(版本11)中生成日期吗?我有以下解决方案,但仅限于5周,我需要一些灵活的方法。 / p>

我在源表中将日期作为一列,我希望这些日期从周六到周日编号,如下所示。

当前查询

 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"

2 个答案:

答案 0 :(得分:1)

使用算术怎么样?

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()来枚举星期数。

Demo on DB Fiddle

答案 1 :(得分:0)

一个序列持续数周,另一个序列持续数天。它很灵活,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;