Sql 编号日期为星期日至星期六
是否有人有一个简单的解决方案,从周日到周六进行编号,并在PostgreSQL(版本11)中生成日期。我有下面的解决方案,但它仅限于5周,我需要一些灵活的方法 我的源表中有一列日期,我希望这些日期从周六到周日编号,如下所示 当前查询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
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;