我可以从我想在PostgreSQL上的月份开始一年中的季度吗



我使用的是PostgreSQL 14.5

我可以使用Postgres关键字QUARTER按季度对年份进行分类,如文档中所示,就像SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');一样。它是有效的。默认季度从January开始。这完全有道理。即,四分之一由JanuaryFebruaryMarch组成。其他人紧随其后。但是,我想让这个月可以配置,这样这个季度就可以在任何一个月开始。

例如。如果月份以April开始,则AprilMayJuly将是第一季度。

我已经开始编写我的自定义函数来想出一个解决方案,但是,

我可以在不创建自定义函数的情况下执行此操作吗?

Hers is it:

SELECT date_trunc('quarter', now() - interval '6 month') AS quarter

所选解决方案的问题是使月份可配置,以便季度可以在任何月份开始是不可能的;您必须更改查询才能更改开始月份。以下是允许此配置的几个自定义函数。

create or replace function what_quarter_is(date_in date, start_mon_in integer default 1) 
returns integer 
language sql 
as $$
with recursive qtrs( mq, q, m, c) as
(select 1,1, start_mon_in, 1  
union all 
select mq%3+1
, case when mq%3+1 = 1 then q+1 else q end
, case when m = 12 then 1 else m+1 end
, c+1 
from qtrs
where c<12
)
select q 
from qtrs
where m = extract('month'  from date_in) ;
$$;

上面将季度定义为从指定月份开始的连续3个月。它从那个月开始构建一个"季度"月历。如果指定了无效月份,函数将返回null

第二个函数是对上述函数的传递。不同之处在于指定为测试的起始月份,即月份名称。注意事项以当地月份名称为准,但很容易更新。虽然它是一个自定义函数,但它也是一条SQL语句。然后,该语句可以被拉出并独立运行;您只需要传递参数。

create or replace function what_quarter_is(date_in date, start_mon_in text)
returns integer 
language sql 
as $$
with mons(mn, m) as
(values ('jan',1), ('feb',2), ('mar',3)
, ('apr',4), ('may',5), ('jun',6)
, ('jul',7), ('aug',8), ('sep',9)
, ('oct',10),('nov',11),('dec',12)
)
select what_quarter_is(date_in,m) 
from mons
where lower(substr(start_mon_in,1,3)) = mn; 
$$; 

与前面的函数一样,如果提供了无效的月份名称,此函数将返回null。但是,与第一个不同的是,它不能单独提取和运行。(见包含每个的演示(

您可以使用简单的条件语句来完成以下操作:

您的查询:

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
提取
1

最新更新