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

ppcbkaq5  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(3)|浏览(153)

我使用的是PostgreSQL 14.5
我可以使用Postgres关键字QUARTER按季度对年份进行分类,如documentation中所示,就像SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');一样。它工作正常。默认季度以January开始。这完全有意义。即,第一季度由JanuaryFebruaryMarch组成。其他季度随后。但是,我想使月份可配置,以便季度可以在任何月份开始。
例如,如果月份以April开始,则AprilMayJuly将是第一季度。
我已经开始编写我的自定义函数来提出一个解决方案,但是,
我可以在不创建自定义函数的情况下执行此操作吗?

6l7fqoea

6l7fqoea1#

她的是:

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

ar5n3qh52#

所选解决方案的问题是 * 使月份可配置,以便季度可以在任何月份开始 * 是不可能的;你必须改变查询来改变开始的月份。2下面是一些允许这种配置的自定义函数。

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
第二个函数是上述函数的传递。它的不同之处在于开始月份被指定为test,即月份名称。Note受本地月份名称的影响,但很容易更新。虽然它是一个自定义函数,但也是一个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。但是,和第一个不同,它不能被提取出来并独立运行。(参见demo包含的每个)

fv2wmkja

fv2wmkja3#

您可以使用简单的条件语句来完成它如下:
您的查询:

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

| 萃取物|
| - ------|
| 1个|
解决方案查询(季度从4月开始):

select   Case
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (4,5,6) then 'Q1'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (7,8,9) then 'Q2'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (10,11,12) then 'Q3'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (1,2,3) then 'Q4'
         End as Quarter

| 季度|
| - ------|
| 第四季度|
从七月开始的季度:

select   Case
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (7,8,9) then 'Q1'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (10,11,12) then 'Q2'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (1,2,3) then 'Q3'
         when extract(month from TIMESTAMP '2001-02-16 20:38:40') in (4,5,6) then 'Q4'
         End as Quarter

fiddle
你也可以像@nikhil sugandh建议的那样使用interval来改变实际日期。
如果你想把四月作为起始月份,那么你需要从你的实际日期中减去3。如果这个月是七月,那么你需要减去6。

select extract(quarter from TIMESTAMP '2001-02-16 20:38:40'-interval '3 Month')

| 萃取物|
| - ------|
| 四个|
fiddle

相关问题