sql - 如何在 PostgreSQL 中按照 ISO 8601 创建日历表?
问题描述
我想在 PostgresSQL 中创建一个看起来像这样的表,并且我已经尝试了不同的代码,但它们似乎都不适用于 PgAdmin。(我还希望这张桌子有多年,而不仅仅是 2021 年)。
解决方案
您可以使用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);
然后使用该表生成您想要的输出。
推荐阅读
- asp.net-core - Is authenticating a service-type user as an end user bad?
- javascript - Node Express joi validation failed when I added .when()
- java - 是否可以在后端使用多个框架(Spring boot + Django)?
- javascript - 多个 XMLHttpRequests - 从多个响应中检索数据
- reactjs - 仅将 React 与函数一起使用有什么好处吗?
- mongoose - Mongoose countDocuments() 返回查询
- blazor - Blazor WASM 在未通过身份验证时重定向到登录 - 不显示布局
- html - SVG 组子项未按预期转换
- c# - 使用 Entity Framework Core 重用查询
- powershell - Powershell:在 Active Directory 中检索 LogonDate