首页 > 解决方案 > 如何在 PostgreSQL 中按照 ISO 8601 创建日历表?

问题描述

我想在 PostgresSQL 中创建一个看起来像这样的表,并且我已经尝试了不同的代码,但它们似乎都不适用于 PgAdmin。(我还希望这张桌子有多年,而不仅仅是 2021 年)。

1

标签: sqlpostgresql

解决方案


您可以使用generate_series()生成这样的输出(这实际上不是该术语通常理解的“日历表”):

select row_number() over (order by t.week_start) as id, 
       extract(isoyear from t.week_start) as year, 
       extract(week from t.week_start) as nr,
       t.week_start::date as "start", 
       (t.week_start + interval '1 week')::date - 1 as "end",
       (t.week_start + interval '1 week')::date - 3 as friday
from generate_series(to_date('2021-04', 'iyyy-iw'), 
                     to_date('2021-04', 'iyyy-iw') + interval '11 week', 
                     interval '1 week') as t(week_start)

您可以根据自己的喜好调整开始日期和结束日期。这个使用您的示例,该示例从 2021 年第 4 周开始,持续 11 周。

在线示例


我想创建一个日历表来存储在我的数据库中,以便我可以在 Lazarus App 中使用它。

正如您在我的示例中所看到的,没有必要在数据库中创建这样的表——至少如果它只是为了显示目的则不需要。

要创建正确的日历表,您实际上不会在表中存储派生信息,如周数开始或结束日期。

如果真的是几周,可以这样做:

create table week_table 
(
  id integer primary key, 
  week_start date not null
);

-- insert all weeks for 2021
insert into week_table
select row_number() over (order by t.week_start) as id, 
       t.week_start::date
from generate_series(to_date('2021-01', 'iyyy-iw'), 
                     to_date('2021-01', 'iyyy-iw') + interval '1 year', 
                     interval '1 week') as t(week_start);

然后使用该表生成您想要的输出。


推荐阅读