问题描述
我正在尝试创建一个包含星期数以及该周的第一个和最后一个日期的字符串,如下所示:
'W41 04 / 10-10 / 10'
我能够在Google表格上创建一个解决我的问题的公式,现在我需要在PostgreSQL上执行此操作。
问题是我们在报告中将星期日用作一周的第一天,而PostgreSQL将星期一用作第一天。
所以对于PostgreSQL第41周,从05/10到11/10,我需要从04/10到10/10
我的问题是:是否也可以更改PostgreSQL的第一天?我创建了一个代码,可以根据需要创建该字符串,但是由于该定义,星期数是错误的。
编辑:
我已使用以下代码纠正了星期几:
ceil(((cte.data::date -((CAST(EXTRACT (year FROM cte.data) as
text)||'-01-04')::date - CAST
(EXTRACT (isodow FROM (CAST(EXTRACT (year FROM cte.data) as
text)||'-01-04')::date)
as integer)
))+1)/7.0)
现在,星期数就出现了,就像我需要的,例如04/10是第41周 现在,我需要根据此日期获得第一个和最后一个日期,到目前为止的结果是:
解决方法
您可以将DATE_TRUNC
与TO_CHAR
函数一起使用
SELECT TO_CHAR(current_date,'"W"IW ')||
TO_CHAR(DATE_TRUNC('week',current_date),'DD/MM - ')||
TO_CHAR(DATE_TRUNC('week',current_date)+ INTERVAL '6 day','DD/MM')
并更改+ INTERVAL 'c day'
(在这种情况下为c=0
,是隐含的和c=6
)内的附加值,以使这些常量之间的差如果您想更改结果中的一周的第一天/最后几天,请设为6
。
经过研究和思考,我使用此代码来获取所需的星期数
ceil(((cte.data::date -((CAST(EXTRACT (year FROM cte.data) as
text)||'-01-04')::date - CAST
(EXTRACT (isodow FROM (CAST(EXTRACT (year FROM cte.data) as
text)||'-01-04')::date)
as integer)
))+1)/7.0)
然后给我一个别名'num',并以此方式计算第一个和最后一个日期:
'W' || num ||
to_char(to_date('20200101','YYYYMMDD')+ (num*7)-10,' DD/MM - ') ||
to_char(to_date('20200101','YYYYMMDD')+ (num*7)-4,'DD/MM') as WEEK
最终输出是星期几,其起始和结束日期都以星期日作为一周的第一天