我使用的是PostgreSQL 14.5
我可以使用Postgres关键字QUARTER
按季度对年份进行分类,如文档中所示,就像SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
一样。它是有效的。默认季度从January
开始。这完全有道理。即,四分之一由January
、February
和March
组成。其他人紧随其后。但是,我想让这个月可以配置,这样这个季度就可以在任何一个月开始。
例如。如果月份以April
开始,则April
、May
和July
将是第一季度。
我已经开始编写我的自定义函数来想出一个解决方案,但是,
我可以在不创建自定义函数的情况下执行此操作吗?
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 |