如何在 PostgreSQL 中更改一周的开始
How to change start of the week in PostgreSQL
我正在尝试创建一个包含周数以及该周的第一个和最后一个日期的字符串,如下所示:
'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
),以便如果您想更改结果中的 first/last 星期几,这些常量之间的差异将是 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
最终输出是周数,周的开始和结束日期使用星期日作为一周的第一天
我正在尝试创建一个包含周数以及该周的第一个和最后一个日期的字符串,如下所示:
'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
),以便如果您想更改结果中的 first/last 星期几,这些常量之间的差异将是 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
最终输出是周数,周的开始和结束日期使用星期日作为一周的第一天