Postgresql获取给定年份中所有iso周的第一天和最后一天

Postgresql获取给定年份中所有iso周的第一天和最后一天,sql,postgresql,Sql,Postgresql,我写这个postgresl脚本是为了得到一年中所有iso周的第一天和最后一天。它工作得很好,我只需要知道它是否可以改进您可以使用生成_series()来避免复杂的CTE和日期算法。下面是一个让您开始学习的示例: select week_num, week_start, week_end,to_char(week_start,'dd Dy Mon yyyy'), to_char(week_end,'dd Dy Mon yyyy') from( WITH RECURSIVE t(n) AS (

我写这个postgresl脚本是为了得到一年中所有iso周的第一天和最后一天。它工作得很好,我只需要知道它是否可以改进

您可以使用
生成_series()
来避免复杂的CTE和日期算法。下面是一个让您开始学习的示例:

select week_num, week_start, week_end,to_char(week_start,'dd Dy Mon yyyy'), to_char(week_end,'dd Dy Mon yyyy') from(
WITH RECURSIVE t(n) AS (
    select (date_trunc('week',(date_trunc('week',(2016 || '-01-04')::date)::date - interval '1 day')::date))::date
  UNION ALL
    SELECT (n - interval '1 week')::date  FROM t WHERE  extract(WEEK from n ) > 1
)
SELECT n as week_start, (n + interval '6 days')::date as week_end, extract(WEEK from n ) as week_num  
FROM t 
) as weeks order by week_num

你会想在第二学期增加一个案例,在2017年去掉任何东西,可以一次重写一周,但这会让你走上正轨。

你可以使用
generate_series()
来避免复杂的CTE和日期算法。下面是一个让您开始学习的示例:

select week_num, week_start, week_end,to_char(week_start,'dd Dy Mon yyyy'), to_char(week_end,'dd Dy Mon yyyy') from(
WITH RECURSIVE t(n) AS (
    select (date_trunc('week',(date_trunc('week',(2016 || '-01-04')::date)::date - interval '1 day')::date))::date
  UNION ALL
    SELECT (n - interval '1 week')::date  FROM t WHERE  extract(WEEK from n ) > 1
)
SELECT n as week_start, (n + interval '6 days')::date as week_end, extract(WEEK from n ) as week_num  
FROM t 
) as weeks order by week_num

你会想在第二学期添加一个案例,以便在2017年删除任何内容,它可以被重写为一周一步,但这会让你走上正确的轨道。

谢谢,我会研究一下,我在答案中添加了一个cast操作符,以便它实际上在psql中运行。先生,2016年1月1日到2016年3月1日怎么样?谢谢,我将研究一下,我在答案中添加了一个cast操作符,因此它实际上在psql中运行。先生,2016年1月1日到2016年1月3日怎么样?